Menu

Java İstisnaları: Hatalar, Yığın İzleri ve Fırlatma

Java istisnasının ne olduğu, yığın izinin nasıl okunacağı, denetlenen ile denetlenmeyen ayrımı, istisna hiyerarşisi ve kendi istisnanızı nasıl fırlatacağınız.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

İstisna Nedir

İstisna, Java'nın "bir şeyler ters gitti ve normal şekilde devam edemiyorum" demesinin yoludur. Hatalı bir değer döndürmek ya da verilerinizi sessizce bozmak yerine çalışma zamanı, sorunu açıklayan bir istisna nesnesi oluşturur ve onu fırlatır. Normal yürütme o noktada durur ve Java durumla nasıl başa çıkacağını bilen kodu aramaya başlar.

Kimse onu işlemezse istisna programınızın en üstüne ulaşır, JVM bir yığın izi yazdırır ve süreç sıfır olmayan bir durumla sonlanır.

"after" ifadesinin asla yazdırılmadığına dikkat edin. numbers[5] değerlendirildiği anda bir ArrayIndexOutOfBoundsException fırlatılır ve main'in geri kalanı terk edilir.

Bir Yığın İzini Okumak

Bir istisna işlenmeden kaldığında, bunun gibi bir çıktı alırsınız. Korkutucu görünür ama aslında yalnızca bir listedir:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at Main.divide(Main.java:8)
	at Main.main(Main.java:4)

Yukarıdan aşağıya okuyun:

  • İlk satır türdür (ArithmeticException) ve bir mesajdır (/ by zero).
  • Her at ... satırı bir yığın çerçevesidir. En üstteki, istisnanın gerçekten fırlatıldığı yerdir - 8. satırdaki divide. Onun altında çağıran vardır, 4. satırdaki main.

En üstteki at satırı ilk bakacağınız yerdir. Altındaki çerçeveler "buraya nasıl geldik?" sorusunu yanıtlar.

Bunu çalıştırın; iz doğrudan a / b satırını gösterir, ardından çağıran olarak main'i gösterir. Bu çağrı zinciri, Java'nın size ücretsiz olarak sunduğu en kullanışlı hata ayıklama aracıdır.

İstisna Hiyerarşisi

Her istisna bir nesnedir ve hepsi Throwable'dan türer. Önemli olan iki dal:

  • Error - JVM'nin ortaya çıkardığı ciddi sorunlar, örneğin OutOfMemoryError veya StackOverflowError. Bunları genellikle yakalamazsınız.
  • Exception - programınızın makul ölçüde öngörebileceği ve işleyebileceği sorunlar. İçinde, NullPointerException gibi günlük hataların ebeveyni olan RuntimeException bulunur.
Throwable
├── Error                 (don't catch: OutOfMemoryError, StackOverflowError)
└── Exception
    ├── IOException        (checked)
    ├── SQLException       (checked)
    └── RuntimeException   (unchecked)
        ├── NullPointerException
        ├── ArithmeticException
        └── ArrayIndexOutOfBoundsException

Bunlar gerçek sınıflar olduğundan, bir istisna bir mesaj taşıyabilir ve ona kendisi hakkında soru sorabilirsiniz:

getMessage() yığın izindeki iki noktadan sonraki metni döndürür; getClass().getSimpleName() istisna türünü adıyla verir.

Denetlenen ve Denetlenmeyen

Bu, yeni başlayanları en çok şaşırtan ayrımdır.

  • Denetlenmeyen istisnalar RuntimeException'ı genişletir. Genellikle kodunuzdaki bir hatayı ifade ederler - beklemediğiniz bir null, hatalı bir indeks, sıfıra bölme. Derleyici sizi bunları işlemeye zorlamaz.
  • Denetlenen istisnalar Exception'ı genişletir ancak RuntimeException'ı genişletmez (örneğin IOException). Kontrolünüz dışındaki durumları temsil ederler - eksik bir dosya, kopan bir ağ bağlantısı. Derleyici sizi bunları ya yakalamaya ya da bildirmeye zorlar.

Bir metot denetlenen bir istisna fırlatabiliyorsa, bunu throws ile belirtmelidir ve her çağıran bununla ilgilenmelidir:

main'den throws Exception'ı kaldırın; kod derlenmez bile - bu, derleyicinin denetlenen sözleşmeyi dayatmasıdır. Denetlenmeyen istisnalar bunu asla gerektirmez.

Kendi İstisnanızı Fırlatmak

Yalnızca istisnalara tepki vermezsiniz - onları kendiniz de ortaya çıkarabilirsiniz. Bir argümanın veya durumun geçersiz olduğunu belirtmek için yeni bir istisna nesnesiyle throw kullanın. Bu, -1 gibi sihirli bir değer döndürüp çağıranın bunu denetlediğini ummaktan çok daha iyidir.

Neyin yanlış olduğunu ve ideal olarak sorunlu değeri açıklayan bir mesaj her zaman ekleyin - yığın izini okuyan gelecekteki kendiniz size teşekkür edecek. Girdileri doğrularken en sık başvuracağınız ikisi IllegalArgumentException ve IllegalStateException'dır.

Sık Yapılan Hatalar

  • İstisnaları yutmak. Bir istisnayı yakalayıp hiçbir şey yapmamak (boş bir blok) hataları gizler. En azından günlüğe kaydedin; genellikle onu işlemeli veya yeniden fırlatmalısınız.
  • Exception'ı çok geniş yakalamak. Temel Exception'ı (ya da daha kötüsü Throwable'ı) yakalamak, işlemeyi amaçlamadığınız sorunları maskeleyebilir. Beklediğiniz belirli türü yakalayın.
  • İzi aşağıdan yukarıya okumak. En alakalı çerçeve, en alttaki değil, en üstteki at satırıdır. Oradan başlayın.
  • ErrorException ile karıştırmak. OutOfMemoryError veya StackOverflowError'dan kurtulmaya çalışmayın; bunun yerine altta yatan nedeni düzeltin.

Sıradaki: try-catch

Artık istisnaların ne olduğunu ve nasıl okunacağını biliyorsunuz. Bir sonraki sayfa onları gerçekte nasıl işleyeceğinizi ele alıyor: riskli kodu bir try bloğuna sarmak, catch içinde kurtarmak ve programınızın çökmek yerine devam etmesi için finally içinde temizleme kodu çalıştırmak.

Sıkça Sorulan Sorular

Java'da istisna nedir?

İstisna, bir program çalışırken algılanan bir sorunu temsil eden bir nesnedir - sıfıra bölme, bir dizinin sonunun ötesine erişme veya null üzerinde bir metot çağırma gibi. Sorun oluştuğunda Java istisnayı fırlatır: normal akışı durdurur ve bunu işleyebilecek kod arar. Hiçbir şey onu işlemezse program bir yığın izi yazdırır ve sonlanır.

Java'da denetlenen ve denetlenmeyen istisna arasındaki fark nedir?

Denetlenen istisnalar (Exception alt sınıfları ancak RuntimeException değil, örneğin IOException) ya yakalanmalı ya da throws ile bildirilmelidir - derleyici bunu zorunlu kılar. Denetlenmeyen istisnalar (RuntimeException alt sınıfları, örneğin NullPointerException, ArrayIndexOutOfBoundsException) genellikle programlama hatalarına işaret eder ve bildirilmesi gerekmez. Error (örneğin OutOfMemoryError) da denetlenmeyendir ve genellikle yakalanması amaçlanmaz.

Java'da bir yığın izini nasıl okurum?

Yukarıdan aşağıya okuyun. İlk satır istisna türünü ve mesajını belirtir (örneğin java.lang.ArithmeticException: / by zero). Altındaki her at ... satırı; metodu, dosyayı ve satır numarasını gösteren bir yığın çerçevesidir; istisnanın fırlatıldığı yerden başlayıp çağıranlar boyunca geriye doğru ilerler. En üstteki at satırı neredeyse her zaman ilk bakılacak yerdir.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA