Menu
Coddy logo textTech

İstisna Sınıfı Hiyerarşisi

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 59 / 87.

Java'nın istisna işleme sistemi, kökünde Throwable sınıfının bulunduğu iyi organize edilmiş bir sınıf hiyerarşisi üzerine kuruludur. Bu hiyerarşiyi anlamak, istisnaları daha etkili bir şekilde yakalamanıza ve işlemenize yardımcı olur.

En üstte, tüm istisnaların ve hataların üst sınıfı olan Throwable bulunur. İki doğrudan alt sınıfı vardır:

Throwable
├── Error          // Ciddi sorunlar (bunları yakalamayın)
└── Exception      // Kurtarılabilir sorunlar
    └── RuntimeException  // Kontrol edilmeyen istisnalar

Error, uygulamaların işlemeye çalışmaması gereken OutOfMemoryError veya StackOverflowError gibi ciddi sorunları temsil eder. Bunlar JVM'nin kendisiyle ilgili temel sorunlara işaret eder.

Exception, en çok çalışacağın daldır. İki kategoriye ayrılır: işaretli istisnalar (Exception sınıfının doğrudan alt sınıfları) ve işaretsiz istisnalar (RuntimeException alt sınıfları).

// Yaygın istisna sınıfları
Exception
├── IOException           // Dosya/ağ sorunları
├── SQLException          // Veritabanı sorunları
└── RuntimeException
    ├── NullPointerException
    ├── ArrayIndexOutOfBoundsException
    └── IllegalArgumentException

İstisnalar sınıf olduğundan kalıtım kurallarını izler. Bir üst istisna türünü yakaladığınızda, onun tüm alt sınıflarını da yakalarsınız:

try {
    // bazı kod
} catch (Exception e) {
    // TÜM istisnaları yakalar (genellikle çok geniş)
}
try {
    // bazı kod
} catch (RuntimeException e) {
    // Catches only runtime exceptions and subclasses
}

Bu hiyerarşi, hataları işlerken gerektiği kadar özel veya genel olmanıza olanak tanır ve kendi özel istisnalarınızı oluşturmanın temelini oluşturur.

challenge icon

Görev

Kolay

Java'nın istisna hiyerarşisinin pratikte nasıl çalıştığını gösteren bir istisna analizörü oluşturalım! Farklı özgüllük düzeylerinde istisnaları yakalayan ve hangi türün yakalandığını bildiren bir sistem oluşturacaksınız.

Kodunuzu üç dosyaya ayıracaksınız:

  • ExceptionThrower.java: Girdiye göre farklı istisna türlerini tetikleyebilen bir sınıf oluşturun. Sınıfınızda üç static metot bulunmalıdır:

    triggerRuntime(String type) - type dizesine bağlı olarak farklı çalışma zamanı istisnaları fırlatın:

    • type "null" ise, mesajı NullPointerException olan bir "Null value encountered" fırlatın
    • type "index" ise, mesajı ArrayIndexOutOfBoundsException olan bir "Invalid index" fırlatın
    • type "argument" ise, mesajı IllegalArgumentException olan bir "Bad argument" fırlatın

    triggerArithmetic() - mesajı ArithmeticException olan bir "Division error" fırlatın

    triggerGeneric() - mesajı IllegalStateException olan bir "Generic runtime error" fırlatın (hiyerarşisi Exception > RuntimeException > IllegalStateException şeklindedir)

  • ExceptionAnalyzer.java: Farklı hiyerarşi düzeylerinde istisnaları yakalayan ve neyin yakalandığını belirleyen bir sınıf oluşturun. Aşağıdaki static metotları ekleyin:

    analyzeSpecific(String type) - ExceptionThrower.triggerRuntime(type) çağrısını bir try bloğu içinde yapın. NullPointerException, ArrayIndexOutOfBoundsException ve IllegalArgumentException için ayrı catch blokları kullanın. Her biri için şu çıktıyı yazdırın: Caught specific: [exception class simple name] ve ardından Message: [exception message]

    analyzeWithParent() - ExceptionThrower.triggerArithmetic() çağrısını bir try bloğu içinde yapın. Bunu RuntimeException (üst tür) kullanarak yakalayın. Şunu yazdırın: Caught via parent: RuntimeException ve ardından Actual type: [exception class simple name]

    analyzeWithGrandparent() - ExceptionThrower.triggerGeneric() çağrısını bir try bloğu içinde yapın. Hiyerarşide daha üstte bulunan Exception kullanarak yakalayın. Şunu yazdırın: Caught via grandparent: Exception ve ardından Actual type: [exception class simple name]

  • Main.java: İstisna analizörünüzü bir araya getirin! Bir girdi alacaksınız: bir istisna türü dizesi (ya "null", "index" ya da "argument").

    Önce === Specific Catch === yazdırın ve girdinizle analyzeSpecific çağrısını yapın.

    Ardından boş bir satır, === Parent Catch === yazdırın ve analyzeWithParent çağrısını yapın.

    Son olarak boş bir satır, === Grandparent Catch === yazdırın ve analyzeWithGrandparent çağrısını yapın.

Bir girdi alacaksınız: tetiklenecek istisna türü ("null", "index" veya "argument").

İstisnanın sınıf adını almak için e.getClass().getSimpleName() ve mesajını almak için e.getMessage() kullanın. Bu görev, bir üst istisna türünü yakalamanın onun tüm alt türlerini de yakaladığını gösterir: istisna işlemenizin ne kadar özel olması gerektiğine karar verirken önemli bir kavramdır!

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String type = scanner.nextLine();
        
        // TODO: Print "=== Specific Catch ===" and call ExceptionAnalyzer.analyzeSpecific(type)
        
        // TODO: Boş bir satır yazdır, sonra "=== Parent Catch ===", sonra ExceptionAnalyzer.analyzeWithParent() çağır
        
        // TODO: Print a blank line, then "=== Grandparent Catch ===", then call ExceptionAnalyzer.analyzeWithGrandparent()
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Java derleyicisi