"Merhaba Amigo. Bugün çok ilginç bir dersimiz olacak. Sana istisnalardan bahsedeceğim. İstisnalar, programdaki hataları halletmemizi sağlayan özel bir mekanizmadır. İşte oluşabilecek bazı hata örnekleri. bir programda:

1. Program, sabit sürücü tamamen dolduğunda bir dosya yazmaya çalışabilir.

2. Program, null referansı saklayan bir değişken üzerinde bir yöntem çağırmayı deneyebilir.

3. Program bir sayıyı 0'a bölmeye çalışabilir."

Tüm bu işlemler hatalarla sonuçlanır. Genellikle sonuç, bu durumda kodu yürütmeye devam etmenin bir anlamı olmadığı için programın hemen sona ermesidir .

"Neden?"

"Araba yoldan çıkıp uçurumdan düşüyorsa direksiyonu çevirmeye devam etmenin bir anlamı var mı?"

"O halde program çalışmayı durdurmalı mı?"

"Evet. En azından eskiden böyle oluyordu. Herhangi bir hata programın kapanmasına neden oluyordu."

"Bu çok akıllıca bir yaklaşım."

"Ama programı çalıştırmaya devam etmek daha iyi olmaz mıydı?"

"Evet. Diyelim ki Word'e çok büyük miktarda metin yazıp kaydettiniz. Ya kaydetme işlemi başarısız olursa ama program sizi her şeyin yolunda olduğuna inandırırsa? Ve yazmaya devam edersiniz. Bu aptalca olur, değil mi? BT?"

"Evet."

"Ardından programcılar ilginç bir çözüm buldular: her işlev kendi çalışmasının durumunu döndürürdü. 0, beklendiği gibi çalıştığı anlamına gelir. Diğer herhangi bir değer, bir hatanın oluştuğu ve dönüş değerinin bir hata kodu olduğu anlamına gelir."

"Ancak, bu yaklaşımın da eksiklikleri var. Her (!) işlev çağrısından sonra, dönüş kodunu (sayı) kontrol etmeniz gerekir. Her şeyden önce, bu sakıncalıdır: hata işleme kodu nadiren çalıştırılır ancak dahil edilmesi gerekir İkincisi, işlevler genellikle farklı değerler döndürür - onlarla ne yapmanız gerekiyor?"

"Doğru. Bunu ben de düşündüm."

"Ardından, istisnalar ve hata işleme mekanizması şeklinde parlak bir gelecek geldi. İşte böyle çalışıyor:

1. Bir hata oluştuğunda, Java Makinesi tüm hata bilgilerini kaydettiği özel bir nesne – bir istisna – oluşturur. Farklı hatalar için farklı istisnalar vardır.

2. Bir istisna, programın ana yöntemden çıkana kadar geçerli işlevden ve bir sonraki işlevden ve bu şekilde devam etmesine neden olur. Ardından program sonlandırılır. Programcılar ayrıca Java Makinesinin 'çağrı yığınını çözdüğünü' söyleyebilirler."

"Ama programın her zaman sona ermediğini söyledin."

"Evet, çünkü bir istisna yakalamanın bir yolu var. Önemsediğimiz istisnaları yakalamak ve onlarla bir şeyler yapmak için doğru yere özel kod yazabiliriz. Bu önemli bir şey."

"Bunu yapmamıza yardımcı olmak için özel bir try-catch yapısı var . İşte böyle çalışıyor:"

Bir istisna yakalayan (0'a bölme) ve çalışmaya devam eden bir program örneği.
public class ExceptionExample2
{
    public static void main(String[] args)
    {
        System.out.println("Program starts");

        try
        {
            System.out.println("Before calling method1");
            method1();
            System.out.println("After calling method1. This will never be shown");
        }
        catch (Exception e)
        {
           System.out.println("Exception has been caught");
        }

        System.out.println("Program is still running");
    }

    public static void method1()
    {
        int a = 100;
        int b = 0;
        System.out.println(a / b);
    }
}
Ekran çıkışı:
Program starts
Before method1 calling
Exception has been caught
Program is still running

"Ama neden ekranda 'Yöntem1 çağrıldıktan sonra. Bu asla gösterilmeyecek' mesajı görüntülenmiyor?"

"Sorduğunuza sevindim. 25. satırda 0'a bölüyoruz, bu da bir hataya, yani bir istisnaya yol açıyor. Java Makinesi, hata hakkında bilgi içeren bir ArithmeticException nesnesi oluşturuyor. Nesne istisna."

"İstisna, method1yöntemin içinde meydana gelir. Bu, yöntemin hemen sonlandırılmasına neden olur. Try-catch bloğu için değilse, ana yöntemin sonlandırılmasına neden olur ."

" Bir try bloğu içinde bir istisna oluşursa , bu catch bloğunda yakalanır . Try bloğundaki kodun geri kalanı yürütülmez. Bunun yerine, catch bloğu yürütülmeye başlar. "

"Anlamıyorum."

"Başka bir deyişle, kod şöyle çalışır:

1. Bir try bloğu içinde bir istisna meydana gelirse , istisnanın meydana geldiği yerde kodun yürütülmesi durdurulur ve catch bloğu çalıştırılmaya başlar.

2. Herhangi bir istisna oluşmazsa, try bloğu sonuna kadar yürütülür ve catch bloğu yürütülmez. "

"Ha?"

"Her yöntem çağrısından sonra, yöntemin normal bir şekilde döndürülüp döndürülmediğini veya bir istisna sonucu aniden sonlandırılıp sonlandırılmadığını kontrol ettiğimizi hayal edin. Bir istisna varsa, o zaman istisnayı yakalamak için (varsa) catch bloğunu çalıştırmak için hareket ederiz. Eğer herhangi bir catch bloğu yoksa mevcut metodu sonlandırırız ve bizi çağıran metot aynı kontrolü gerçekleştirir."

"Sanırım şimdi anladım."

"Harika."

"catch ifadesinde 'İstisna' ne anlama geliyor?"

" Tüm istisnalar, İstisna sınıfını miras alan sınıflardır. İstisna sınıfını catch bloğunda belirterek belirli bir istisnayı yakalayabiliriz veya ortak üst sınıflarını - İstisna'yı belirterek tüm istisnaları yakalayabiliriz. Ardından gerekli tüm hatayı alabiliriz. e değişkeninden bilgi (istisna nesnesine bir referans depolar)."

"Harika! Yöntemimde farklı istisnalar oluşursa, onları farklı şekilde işleyebilir miyim?"

"Sadece yapabilirsin değil, yapmalısın da. Bunu şu şekilde yapabilirsin:"

Örnek:
public class ExceptionExample2
{
    public static void main(String[] args)
    {
        System.out.println("Program starts");

        try
        {
            System.out.println("Before calling method1");
            method1();
            System.out.println("After calling method1. This will never be shown");
        }
        catch (NullPointerException e)
        {
           System.out.println("Null reference. Exception has been caught");
        }
        catch (ArithmeticException e)
        {
            System.out.println("Division by zero. Exception has been caught");
        }
        catch (Exception e)
        {
            System.out.println("Any other errors. Exception has been caught");
        }

        System.out.println("Program is still running");
    }

    public static void method1()
    {
        int a = 100;
        int b = 0;
        System.out.println(a / b);
    }
}

" try bloğu , her biri belirtilen istisna türlerini yakalayacak birkaç catch bloğu ile eşleştirilebilir ."

"Anladığımı sanıyorum. Bunu henüz kendim yazamam ama şifreli olarak görürsem korkmam."