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 üst sınıfı 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 istisnalar

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

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 geniştir)
}
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ü (exception analyzer) oluşturalım! Farklı özgünlük seviyelerinde 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 üç statik metoda sahip 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 RuntimeException fırlatın

  • ExceptionAnalyzer.java: Farklı hiyerarşi seviyelerinde 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 görev, 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!

Kopya kağıdı

Java'nın istisna yönetimi, temeli Throwable sınıfına dayanan bir sınıf hiyerarşisi üzerine kuruludur:

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

Error, uygulamaların ele almaması gereken OutOfMemoryError veya StackOverflowError gibi ciddi JVM problemlerini temsil eder.

Exception, kontrol edilen istisnalar (doğrudan alt sınıflar) ve kontrol edilmeyen istisnalar (RuntimeException alt sınıfları) olarak ikiye ayrılır:

Exception
├── IOException           // Dosya/ağ problemleri
├── SQLException          // Veritabanı problemleri
└── RuntimeException
    ├── NullPointerException
    ├── ArrayIndexOutOfBoundsException
    └── IllegalArgumentException

Üst bir istisna türünü yakalamak, onun tüm alt sınıflarını da yakalar:

try {
    // bazı kodlar
} catch (Exception e) {
    // TÜM istisnaları yakalar
}

try {
    // bazı kodlar
} catch (RuntimeException e) {
    // Sadece çalışma zamanı istisnalarını ve alt sınıflarını yakalar
}

İstisnanın sınıf adını almak için e.getClass().getSimpleName() ve mesajını almak için e.getMessage() kullanın.

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 ve ExceptionAnalyzer.analyzeSpecific(type) çağır
        
        // TODO: Boş bir satır yazdır, ardından "=== Parent Catch ===" yazdır ve ExceptionAnalyzer.analyzeWithParent() çağır
        
        // TODO: Boş bir satır yazdır, ardından "=== Grandparent Catch ===" yazdır ve ExceptionAnalyzer.analyzeWithGrandparent() çağır
    }
}
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