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, temeli Throwable sınıfına dayanan, 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 tepede, tüm istisnaların ve hataların atası olan Throwable yer alır. İki doğrudan alt sınıfı vardır:

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

Error, OutOfMemoryError veya StackOverflowError gibi uygulamaların ele almaya çalışmaması gereken ciddi sorunları temsil eder. Bunlar, JVM'nin kendisiyle ilgili temel sorunları gösterir.

Exception, en çok çalışacağınız daldır. İki kategoriye ayrılır: denetimli istisnalar (Exception sınıfının doğrudan alt sınıfları) ve denetimsiz 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 oldukları için kalıtım kurallarına uyarlar. Bir üst sınıf istisna türünü yakaladığınızda, onun tüm alt sınıflarını da yakalamış olursunuz:

try {
    // bazı kodlar
} catch (Exception e) {
    // TÜM istisnaları yakalar (genellikle çok kapsamlıdır)
}
try {
    // bazı kodlar
} catch (RuntimeException e) {
    // Sadece çalışma zamanı istisnalarını ve alt sınıflarını yakalar
}

Bu hiyerarşi, hataları ele alırken gerektiği kadar spesifik veya genel olmanıza olanak tanır ve kendi özel istisnalarınızı oluşturmanın temelidir.

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ünlük seviyelerindeki istisnaları yakalayan ve hangi türün yakalandığını raporlayan bir sistem oluşturacaksınız.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • ExceptionThrower.java: Girdiye bağlı olarak farklı türde istisnaları tetikleyebilen bir sınıf oluşturun. Sınıfınızın üç statik metodu olmalıdır:

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

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

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

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

  • ExceptionAnalyzer.java: Farklı hiyerarşi seviyelerindeki istisnaları yakalayan ve neyin yakalandığını tanımlayan bir sınıf oluşturun. Şu statik metodları ekleyin:

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

    analyzeWithParent() - Bir try bloğu içinde ExceptionThrower.triggerArithmetic() metodunu çağırı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() - Bir try bloğu içinde ExceptionThrower.triggerGeneric() metodunu çağırın. Bunu Exception (hiyerarşide daha da üstte) 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 ("null", "index" veya "argument").

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

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

    Son olarak, boş bir satır, === Grandparent Catch === yazdırın ve analyzeWithGrandparent metodunu çağırı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 meydan okuma, bir üst istisna türünü yakalamanın tüm alt türlerini de nasıl yakaladığını gösterir; bu, istisna yönetiminizin ne kadar spesifik olması gerektiğine karar verirken anahtar 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: "=== Specific Catch ===" yazdırın ve ExceptionAnalyzer.analyzeSpecific(type) çağrısı yapın
        
        // TODO: Boş bir satır yazdırın, ardından "=== Parent Catch ===" yazdırın, sonra ExceptionAnalyzer.analyzeWithParent() çağrısı yapın
        
        // TODO: Boş bir satır yazdırın, ardından "=== Grandparent Catch ===" yazdırın, sonra ExceptionAnalyzer.analyzeWithGrandparent() çağrısı yapın
    }
}
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