İ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 istisnalarError, 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.
Görev
KolayJava'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 birNullPointerExceptionfırlatın - Eğer type
"index"ise,"Invalid index"mesajıyla birArrayIndexOutOfBoundsExceptionfırlatın - Eğer type
"argument"ise,"Bad argument"mesajıyla birIllegalArgumentExceptionfırlatın
triggerArithmetic()-"Division error"mesajıyla birArithmeticExceptionfırlatıntriggerGeneric()-"Generic runtime error"mesajıyla birRuntimeExceptionfırlatın- Eğer type
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çindeExceptionThrower.triggerRuntime(type)metodunu çağırın.NullPointerException,ArrayIndexOutOfBoundsExceptionveIllegalArgumentExceptioniçin ayrı catch blokları kullanın. Her biri için şunu yazdırın:Caught specific: [exception class simple name]ve ardındanMessage: [exception message]analyzeWithParent()- Bir try bloğu içindeExceptionThrower.triggerArithmetic()metodunu çağırın. BunuRuntimeException(üst tür) kullanarak yakalayın. Şunu yazdırın:Caught via parent: RuntimeExceptionve ardındanActual type: [exception class simple name]analyzeWithGrandparent()- Bir try bloğu içindeExceptionThrower.triggerGeneric()metodunu çağırın. BunuException(hiyerarşide daha da üstte) kullanarak yakalayın. Şunu yazdırın:Caught via grandparent: Exceptionve ardındanActual 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 girdinizleanalyzeSpecificmetodunu çağırın.Ardından boş bir satır,
=== Parent Catch ===yazdırın veanalyzeWithParentmetodunu çağırın.Son olarak, boş bir satır,
=== Grandparent Catch ===yazdırın veanalyzeWithGrandparentmetodunu ç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) istisnalarError, 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
}
}
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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama10OOP'de İstisna Yönetimi
İstisna Sınıfı HiyerarşisiÖzel İstisnalarDenetimli ve Denetimsiz HatalarTry-With-Resources YapısıÖzet - Doğrulanmış Kullanıcı2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı