Denetimli ve Denetimsiz Hatalar
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 61 / 87.
Java'nın istisna hiyerarşisinin farklı dallara ayrıldığını gördün. Anlaman gereken temel ayrım, checked ve unchecked istisnalar arasındadır. Bu, onları kodunda nasıl ele alman gerektiğini etkiler.
Denetimli istisnalar, derleyicinin ele almanızı zorunlu kıldığı istisnalardır. Doğrudan Exception sınıfını genişletirler (RuntimeException üzerinden değil). Bunları ya yakalamanız ya da throws ile bildirmeniz gerekir:
// IOException ele alınmalı - checked bir exception
public void readFile(String path) throws IOException {
FileReader reader = new FileReader(path); // IOException fırlatabilir
}
// Ya da yakala
public void readFileSafe(String path) {
try {
FileReader reader = new FileReader(path);
} catch (IOException e) {
System.out.println("File error: " + e.getMessage());
}
}Denetlenmeyen istisnalar RuntimeException sınıfını genişletir. Derleyici bunları ele almanızı zorunlu kılmaz. Bunlar genellikle null başvuruları veya geçersiz dizi erişimi gibi programlama hatalarına işaret eder:
// throws bildirimi gerekmez
public int divide(int a, int b) {
return a / b; // ArithmeticException fırlatabilir (unchecked)
}
String name = null;
name.length(); // NullPointerException (unchecked)Özel istisnalar oluştururken, çağıranların bunları nasıl ele almasını istediğinize göre üst sınıfı seçin. Çağıranın öngörmesi gereken ve kurtarılabilir durumlar için checked istisnaları kullanın. Doğru kodda meydana gelmemesi gereken programlama hataları için unchecked istisnaları kullanın.
Görev
KolayChecked ve unchecked istisnalar arasındaki temel farkı gösteren bir yaş doğrulama sistemi oluşturalım! Her iki türden özel istisnalar oluşturacak ve derleyicinin bunlara nasıl farklı davrandığını göreceksin.
Kodunu dört dosyaya ayıracaksın:
InvalidAgeException.java: Yaş doğrulama hataları için bir checked istisna oluştur. Bu istisna doğrudanExceptionsınıfını genişletmeli; bu, çağıranların istisnayı ele almak zorunda kalacağı anlamına gelir. Bir mesaj kabul eden ve bu mesajı üst sınıfa aktaran bir oluşturucu ekle.NegativeAgeException.java: Birisi negatif yaş girdiğinde (doğru girdilerle gerçekleşmemesi gereken bir programlama hatası) kullanılacak bir unchecked istisna oluştur. Bu istisnaRuntimeExceptionsınıfını genişletmeli. Bir mesaj kabul eden ve bu mesajı üst sınıfa aktaran bir oluşturucu ekle.AgeVerifier.java: Her iki istisna türünü kullanarak yaşları doğrulayan bir sınıf oluştur. İki statik metot ekle:verifyAge(int age)- Yaş 0'dan küçükse bu metot,NegativeAgeExceptionmesajıyla"Age cannot be negative: [age]"(unchecked) fırlatmalı. Yaş 18'den küçükseInvalidAgeExceptionmesajıyla"Must be 18 or older: [age]"(checked) fırlatmalı. Aksi takdirdeAge [age] verified successfullyyazdırmalı. Bu metot checked bir istisna fırlattığından, metoduthrows InvalidAgeExceptionile bildirmelisin.verifyAgeUncheckedOnly(int age)- Bu metot yalnızca unchecked istisnalar kullanır. Yaş negatifse aynı mesaj biçimiyleNegativeAgeExceptionfırlatmalı. Yaş 18'den küçükseIllegalArgumentExceptionmesajıyla bir"Too young: [age]"fırlatmalı. Aksi takdirdeAge [age] verified (unchecked method)yazdırmalı. Bu metodun herhangi birthrowsbildirimi gerektirmediğine dikkat et!Main.java: Doğrulama sistemini bir araya getir! Bir girdi alacaksın: bir yaş (tamsayı).Önce
=== Checked Exception Method ===yazdır ve girdi yaşıylaverifyAgemetodunu çağır. Bu metot checked bir istisna fırlattığından, çağrıyı bir try-catch içine almalısın.InvalidAgeExceptionyakala veChecked exception caught: [message]yazdır. AyrıcaNegativeAgeExceptionyakala veUnchecked exception caught: [message]yazdır.Ardından boş bir satır ve
=== Unchecked Exception Method ===yazdır. Aynı yaşlaverifyAgeUncheckedOnlymetodunu çağır. Bu metot istisnalar fırlatabilse de bunları yakalamak zorunda değilsin. Ancak hataları düzgün bir şekilde ele almak için çağrıyı yine de bir try-catch içine al.NegativeAgeExceptionyakala veRuntime exception caught: [message]yazdır.IllegalArgumentExceptionyakala veIllegal argument caught: [message]yazdır.
Doğrulanacak yaşı temsil eden bir tamsayı olmak üzere bir girdi alacaksın.
Temel farka dikkat et: checked istisna içeren metot bir throws bildirimi gerektirir ve çağıranları bunu ele almaya zorlar; unchecked metot ise herhangi bir istisna işleme kodu olmadan sorunsuz şekilde derlenir. Java'da checked ve unchecked istisnalar arasındaki temel ayrım budur!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
// TODO: Test the checked exception method
// Print: "=== Checked Exception Method ==="
// AgeVerifier.verifyAge(age) metodunu bir try-catch içinde çağır
// - Catch InvalidAgeException: print "Checked exception caught: [message]"
// - Catch NegativeAgeException: print "Unchecked exception caught: [message]"
// TODO: Print a blank line, then "=== Unchecked Exception Method ==="
// AgeVerifier.verifyAgeUncheckedOnly(age) metodunu bir try-catch içinde çağır
// - Catch NegativeAgeException: print "Runtime exception caught: [message]"
// - Catch IllegalArgumentException: print "Illegal argument caught: [message]"
}
}
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