1. İstisnalar

>

Sonunda, programcılar hata işlemeyi standartlaştırmayı ve otomatikleştirmeyi düşündüler. Bu, istisnalar icat edildiğinde oldu . İstisna mekanizması artık istisnai durumların %80'ini yönetiyor.

Bazı akademisyenler istisnalarla geldiyse, bu muhtemelen onun doktora tezinin konusuydu. Bunu bir programcı bulduysa, o zaman bir iş arkadaşından sırtına dostça bir şaplak almış olabilir: "İyi görünüyor, kardeşim."

Bir Java programında bölme işlemi gibi bir hata oluştuğunda 0bazı harika şeyler olur:

Adım bir

Oluşan hata hakkında bilgi içeren özel bir istisna nesnesi oluşturulur.

Java'da her şey bir nesnedir ve istisnalar istisna değildir 🙂 İstisna nesnelerinin kendi sınıfları vardır ve onları sıradan sınıflardan ayıran tek şey sınıfı miras almalarıdır Throwable.

İkinci adım

İstisna nesnesi "atılır". Belki buradaki ifade daha iyi olabilirdi. "İstisna atmak" daha çok bir yangın alarmını tetiklemeye veya bir "DEFCON 1" uyarısı vermeye benzer.

Java makinesine bir istisna atıldığında programın normal çalışması durur ve "acil durum protokolleri" başlar.

Adım üç

İstisnanın atıldığı yöntemden hemen çıkılır. İstisna, yine hemen çıkan çağıran yönteme iletilir. Ve böylece yöntem çıkana kadar zincir boyunca devam eder main. Yöntem mainsona erdiğinde, program da sona erer.

Örnek:

kod Konsol çıkışı
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Your attention, please! Preparing for the end of the world");
      endTheWorld();
      System.out.println("The world ended successfully");
   }

   public static void endTheWorld()
   {
      System.out.println("We're doing something important");
      doSomeWork(0);
      System.out.println("Everything is working well");
   }

   public static void doSomeWork(int n)
   {
      System.out.println("Nothing terrible will happen: " + n);
      System.out.println(2 / n);
      System.out.println("Nothing terrible happened: " + n);
   }
}
Your attention, please! Preparing for the end of the world
We're doing something important
Nothing terrible will happen: 0

20. satırda bir istisna oluşur: 0'a bölme. Java makinesi hemen bir istisna oluşturur - bir ArithmeticExceptionnesne ve onu yönteme "fırlatır".

Yöntem divide()hemen sona erer, bu nedenle şu dizeyi asla görmeyiz: Korkunç bir şey olmadı: 0. Program yönteme geri döner endTheWorld()ve durum kendini tekrar eder: sistemde işlenmeyen bir istisna vardır, bu da yöntemin endTheWorld()de anormal şekilde sonlandığı anlamına gelir. Ardından mainyöntem sonlandırılır ve program durur.

Bu istisnaların amacı nedir? Belirli istisna türlerini yakalamak için kendi kodunuzu yazabilir ve istisnai durumlarla başa çıkmak için kendi mantığınızı yazabilirsiniz.


2. İstisnaları yakalamak:try-catch

Java, yöntemlerin bu anormal şekilde sonlandırılmasını durdurmanıza izin veren bir istisna yakalama mekanizmasına sahiptir. Şuna benziyor:

try
{
   // Code where an exception might occur
}
catch(ExceptionType name)
{
   // Exception handling code
}

Bu yapıya blok denir try-catch.

İstisnaların meydana gelebileceği kod , kelimeden önce kaşlı ayraçlar içine alınır try.

Kıvrımlı parantezlerden sonra, catchanahtar kelimemiz ve parantezler içinde bir istisna değişkeni bildirimimiz var . Bunu , belirtilen türden bir istisna meydana gelirse yürütülecek kodu saran kaşlı ayraçlar izler .

" Birincil kodun " yürütülmesi sırasında herhangi bir istisna atılmazsa , catch bloğu içindeki kod yürütülmeyecektir. Bir istisna meydana gelirse, o zaman olacaktır (atılan istisnanın tipi parantez içindeki değişkenin tipiyle aynıysa).

Örnek:

kod Konsol çıkışı
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Hadron Collider launched");

      try
      {
         launchHadronCollider(1);
         launchHadronCollider(0);
      }
      catch(Exception e)
      {
         System.out.println("Error! Caught an exception");
         System.out.println("The planet was sucked into a black hole!");
      }

      System.out.println("The Hadron Collider stopped");
   }

   public static void launchHadronCollider(int n)
   {
      System.out.println("Everything is working well: " + n);
      System.out.println(2/n);
      System.out.println("There are no problems: " + n);
   }
}
Hadron Collider launched
Everything is working fine: 1
2
There are no problems: 1
Everything is working fine: 0
Error! Caught an exception
The planet has been sucked into a black hole!
The Hadron Collider is stopped


3. Çoklu catchbloklar

Çoklu yakalama blokları

Teorik olarak, her türlü istisna bir kod bloğuna atılabilir. Bazılarını bir şekilde halletmek isteyeceksiniz, diğerlerini başka bir şekilde ve yine bazılarını hiç halletmemeye karar vereceksiniz.

catchJava geliştiricileri size yardım etmeye ve bloktan sonra bir değil birçok blok yazmanıza izin vermeye karar verdi try.

try
{
   // Code where an exception might occur
}
catch (ExceptionType1 name1)
{
   // Code for handling ExceptionType1
}
catch (ExceptionType2 name2)
{
   // Code for handling ExceptionType2
}
   catch (ExceptionType3 name3)
{
   // Code for handling ExceptionType3
}

Örnek:

kod Konsol çıkışı
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Start of main method");
      try
      {
         calculate(0);
      }
      catch (ArithmeticException e)
      {
         System.out.println("Division by 0");
      }
      catch(Exception e)
      {
         System.out.println("Caught some kind of exception");
      }

      System.out.println("End of main method");
   }

   public static void calculate(int n)
   {
      System.out.println("Start of calculate method: " + n);
      System.out.println(2/n);
      System.out.println("End of calculate method: " + n);
   }
}
Start of main method
Start of calculate method: 0
Division by 0
End of main method


catch4. Blok sırası

Bir blokta meydana gelen istisnalar trysadece tek bir blok tarafından yakalanabilir catch. Birden çok bloktan gelen kodun yürütüldüğü bir istisna işleme durumuna sahip olamazsınız .catch

Ancak blokların sırası önemlidir.

Bir istisnanın birden fazla blok tarafından yakalanabileceği bir durumla karşılaşabilirsiniz. Durum buysa, istisna hangi catch bloğu önce gelirse (bloğa en yakın ) tarafından yakalanacaktır try.

Birden çok catch bloğunun aynı istisnayı yakalayabileceği bir duruma nasıl sahip olabilirsiniz?

Tüm istisnalar tek bir kalıtım hiyerarşisine aittir - şemaya bakın.

İstisna hiyerarşisi

Bir nesne, türü veya ata sınıflarından herhangi biriArithmeticException olan bir değişkene atanabilir : , ve - diyagrama bakın.ArithmeticException RuntimeExceptionExceptionThrowable

Seviye 21'de kalıtım ve ata sınıfları hakkında daha fazla konuşacağız.

Bu kod gayet iyi derlenecek:

Mirasın faydaları:
ArithmeticException ae    = new ArithmeticException();
RuntimeException runtime  = new ArithmeticException();
Exception exception       = new ArithmeticException();
Throwable trwbl           = new ArithmeticException();

ArithmeticExceptionBöylece yukarıdaki 4 bloktan herhangi biri ile an yakalayabilirsiniz catch.

Örnek 1:

kod Konsol çıkışı
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Start of main method");
      try
      {
         calculate(0);
      }
      catch(ArithmeticException e)
      {
         System.out.println("Division by 0");
      }
      catch(Exception e)
      {
         System.out.println("Caught some kind of exception");
      }

      System.out.println("End of main method");
   }

   public static void calculate(int n)
   {
      System.out.println("Start of calculate method: " + n);
      System.out.println(2/n);
      System.out.println("End of calculate method: " + n);
   }
}
Start of main method
Start of calculate method: 0
Division by 0
End of main method

Bu örnekte, hem ve blokları ArithmeticExceptiontarafından yakalanabilir . Bloğa en yakın blok olan ilk blok tarafından yakalanacaktır .catch (Exception e)catch (ArithmeticException e)trycatch

Sürprizlerden kaçınmak için, blok listesinin sonuna yakın bir yerecatch neredeyse her istisnayı yakalayabilen bloklar yerleştirmek en iyisidir .catch

Tür genellikle Java'daki olası tüm istisnaları yakalamaThrowable yeteneğine sahiptir . İlk bloğa koyarsanız , derleyici ulaşılamaz kod blokları olduğunu bildiğinden kod derlenmez.catch