İ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 exception işleme sistemi, kökü Throwable sınıfına dayanan iyi düzenlenmiş bir sınıf hiyerarşisi üzerine kuruludur. Bu hiyerarşiyi anlamak, exceptions öğelerini daha etkili bir şekilde yakalayıp 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 istisnalarError, 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: checked exceptions (Exception sınıfının doğrudan alt sınıfları) ve unchecked exceptions (RuntimeException alt sınıfları).
// Yaygın istisna sınıfları
Exception
├── IOException // Dosya/ağ sorunları
├── SQLException // Veritabanı sorunları
└── RuntimeException
├── NullPointerException
├── ArrayIndexOutOfBoundsException
└── IllegalArgumentExceptionÇünkü exceptions classes olduğundan, kalıtım kurallarını izlerler. Bir üst exception 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 hierarchy, error'ları işlerken gerektiği kadar spesifik veya genel olmanıza olanak tanır ve kendi özel exceptions'larınızı oluşturmanın temelini oluşturur.
Görev
KolayJava'nın exception hierarchy'sinin pratikte nasıl çalıştığını gösteren bir exception analyzer oluşturalım! Farklı specificity düzeylerinde exception'ları yakalayan ve hangi türün yakalandığını bildiren bir sistem oluşturacaksın.
Code'unu üç dosyaya ayıracaksın:
ExceptionThrower.java: Input'a göre farklı exception türlerini tetikleyebilen bir class oluştur. Class'ının üç static method'u olmalı:triggerRuntime(String type)- Type string'e göre farklı runtime exception'lar fırlat:- Type
"null"ise,"Null value encountered"mesajıyla birNullPointerExceptionfırlat - Type
"index"ise,"Invalid index"mesajıyla birArrayIndexOutOfBoundsExceptionfırlat - Type
"argument"ise,"Bad argument"mesajıyla birIllegalArgumentExceptionfırlat
triggerArithmetic()-"Division error"mesajıyla birArithmeticExceptionfırlattriggerGeneric()-"Generic runtime error"mesajıyla birIllegalStateExceptionfırlat (hierarchy'si Exception > RuntimeException > IllegalStateException şeklindedir)- Type
ExceptionAnalyzer.java: Farklı hierarchy düzeylerinde exception'ları yakalayan ve neyin yakalandığını belirleyen bir class oluştur. Aşağıdaki static method'ları ekle:analyzeSpecific(String type)-ExceptionThrower.triggerRuntime(type)çağrısını bir try block'u içinde yap.NullPointerException,ArrayIndexOutOfBoundsExceptionveIllegalArgumentExceptioniçin ayrı catch block'ları kullan. Her biri için şunları yazdır:Caught specific: [exception class simple name]ve ardındanMessage: [exception message]analyzeWithParent()-ExceptionThrower.triggerArithmetic()çağrısını bir try block'u içinde yap. BunuRuntimeException(parent type) kullanarak yakala. Şunu yazdır:Caught via parent: RuntimeExceptionve ardındanActual type: [exception class simple name]analyzeWithGrandparent()-ExceptionThrower.triggerGeneric()çağrısını bir try block'u içinde yap. BunuException(hierarchy'de daha üstte) kullanarak yakala. Şunu yazdır:Caught via grandparent: Exceptionve ardındanActual type: [exception class simple name]Main.java: Exception analyzer'ını bir araya getir! Bir input alacaksın: bir exception type string'i (ya"null","index"ya da"argument").Önce
=== Specific Catch ===yazdır ve input'unlaanalyzeSpecificçağrısını yap.Ardından boş bir satır,
=== Parent Catch ===yazdır veanalyzeWithParentçağrısını yap.Son olarak boş bir satır,
=== Grandparent Catch ===yazdır veanalyzeWithGrandparentçağrısını yap.
Bir input alacaksın: tetiklenecek exception type'ı ("null", "index" veya "argument").
Exception'ın class adını almak için e.getClass().getSimpleName(), mesajını almak için e.getMessage() kullan. Bu challenge, bir parent exception type'ını yakalamanın tüm child'larını da yakaladığını gösterir: exception handling'inin ne kadar specific olması gerektiğine karar verirken önemli bir concept!
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()
}
}
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ıKendi başına pratik yap: Online Java derleyicisi