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üz. Anlamanız gereken temel ayrım, checked (denetimli) ve unchecked (denetimsiz) istisnalar arasındadır; bu, onları kodunuzda nasıl işlemeniz gerektiğini etkiler.
Kontrollü istisnalar (Checked exceptions), derleyicinin sizi ele almaya zorladığı istisnalardır. Doğrudan Exception sınıfını genişletirler (RuntimeException üzerinden değil). Bunları ya yakalamalı ya da throws ile bildirmelisiniz:
// IOException ele alınmalıdır - bu kontrol edilen (checked) bir istisnadır
public void readFile(String path) throws IOException {
FileReader reader = new FileReader(path); // IOException fırlatabilir
}
// Veya yakalayın
public void readFileSafe(String path) {
try {
FileReader reader = new FileReader(path);
} catch (IOException e) {
System.out.println("File error: " + e.getMessage());
}
}Denetlenmeyen istisnalar (Unchecked exceptions) RuntimeException sınıfını genişletir. Derleyici bunları işlemenizi gerektirmez; bunlar genellikle null referansları veya geçersiz dizi erişimi gibi programlama hatalarını belirtir:
// throws deklarasyonuna gerek yoktur
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 işlemesini istediğinize bağlı olarak üst sınıfı seçin. Çağıranın öngörmesi gereken kurtarılabilir durumlar için denetimli istisnalar (checked exceptions) kullanın. Doğru kodda oluşmaması gereken programlama hataları için denetimsiz istisnalar (unchecked exceptions) kullanın.
Görev
KolayDenetimli (checked) ve denetimsiz (unchecked) istisnalar arasındaki temel farkı gösteren bir yaş doğrulama sistemi kuralım! Her iki türden de özel istisnalar oluşturacak ve derleyicinin bunlara nasıl farklı davrandığını göreceksiniz.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
InvalidAgeException.java: Yaş doğrulama hataları için bir denetimli istisna (checked exception) oluşturun. Bu istisna doğrudanExceptionsınıfını genişletmelidir, yani çağıranlar bunu ele almaya zorlanacaktır. Bir mesaj kabul eden ve bunu üst sınıfa ileten bir yapıcı (constructor) ekleyin.NegativeAgeException.java: Birisi negatif bir yaş girdiğinde (doğru girdiyle olmaması gereken bir programlama hatası) kullanılacak bir denetimsiz istisna (unchecked exception) oluşturun. Bu,RuntimeExceptionsınıfını genişletmelidir. Bir mesaj kabul eden ve bunu üst sınıfa ileten bir yapıcı ekleyin.AgeVerifier.java: Her iki istisna türünü de kullanarak yaşları doğrulayan bir sınıf oluşturun. İki statik yöntem ekleyin:verifyAge(int age)- Bu yöntem, yaş 0'dan küçükse"Age cannot be negative: " + agemesajıyla birNegativeAgeException(denetimsiz) fırlatmalıdır. Yaş 18'den küçükse,"Must be 18 or older: " + agemesajıyla birInvalidAgeException(denetimli) fırlatın. Aksi takdirde,"Age " + age + " verified successfully"yazdırın. Bu yöntem denetimli bir istisna fırlattığı için, onuthrows InvalidAgeExceptionile bildirmelisiniz.verifyAgeUncheckedOnly(int age)- Bu yöntem yalnızca denetimsiz istisnaları kullanır. Yaş negatifse, aynı mesaj formatıylaNegativeAgeExceptionfırlatın. Yaş 18'den küçükse,"Too young: " + agemesajıyla birIllegalArgumentExceptionfırlatın. Aksi takdirde,"Age " + age + " verified (unchecked method)"yazdırın. Bu yönteminthrowsbildirimine ihtiyaç duymadığına dikkat edin!Main.java: Doğrulama sisteminizi bir araya getirin! Bir girdi alacaksınız: bir yaş (tamsayı).Önce,
"=== Checked Exception Method ==="yazdırın ve girdi olarak alınan yaş ileverifyAgeyöntemini çağırın. Denetimli bir istisna fırlattığı için, onu bir try-catch bloğuna almalısınız.InvalidAgeExceptionistisnasını yakalayın ve"Checked exception caught: " + e.getMessage()yazdırın. AyrıcaNegativeAgeExceptionistisnasını yakalayın ve"Unchecked exception caught: " + e.getMessage()yazdırın.Ardından boş bir satır ve
"=== Unchecked Exception Method ==="yazdırın. Aynı yaş ileverifyAgeUncheckedOnlyyöntemini çağırın. Bu yöntem istisna fırlatabilse de, onları yakalamaya zorlanmazsınız. Ancak, hataları düzgün bir şekilde ele almak için yine de bir try-catch bloğuna alın.NegativeAgeExceptionistisnasını yakalayın ve"Runtime exception caught: " + e.getMessage()yazdırın.IllegalArgumentExceptionistisnasını yakalayın ve"Illegal argument caught: " + e.getMessage()yazdırın.
Bir girdi alacaksınız: doğrulanacak yaşı temsil eden bir tamsayı.
Temel farka dikkat edin: denetimli istisnaya sahip yöntem bir throws bildirimi gerektirir ve çağıranları bunu ele almaya zorlar; denetimsiz yöntem ise herhangi bir istisna işleme olmasa bile sorunsuz derlenir. Bu, Java'daki denetimli ve denetimsiz istisnalar arasındaki temel ayrımdır!
Kopya kağıdı
Java istisnaları, derleyicinin bunların işlenmesini nasıl zorunlu kıldığını belirleyen checked (denetimli) ve unchecked (denetimsiz) istisnalar olarak ikiye ayrılır.
Checked istisnalar doğrudan Exception sınıfını genişletir (RuntimeException üzerinden değil). Derleyici, sizi bunları yakalamaya veya throws ile bildirmeye zorlar:
// throws ile bildirilmelidir
public void readFile(String path) throws IOException {
FileReader reader = new FileReader(path);
}
// Veya yakalanmalıdır
public void readFileSafe(String path) {
try {
FileReader reader = new FileReader(path);
} catch (IOException e) {
System.out.println("File error: " + e.getMessage());
}
}Unchecked istisnalar RuntimeException sınıfını genişletir. Derleyici bunları işlemenizi gerektirmez. Genellikle programlama hatalarını belirtirler:
// 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 işlemesi gerektiğine bağlı olarak üst sınıfı seçin:
- Çağıranın öngörmesi gereken kurtarılabilir durumlar için checked istisnaları (
Exceptionsınıfını genişletin) kullanın - Doğru kodda oluşmaması gereken programlama hataları için unchecked istisnaları (
RuntimeExceptionsınıfını genişletin) kullanın
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: Kontrollü istisna (checked exception) yöntemini test edin
// Yazdır: "=== Checked Exception Method ==="
// Bir try-catch bloğu içinde AgeVerifier.verifyAge(age) metodunu çağırın
// - InvalidAgeException yakala: "Checked exception caught: [mesaj]" yazdır
// - NegativeAgeException yakala: "Unchecked exception caught: [mesaj]" yazdır
// TODO: Boş bir satır yazdırın, ardından "=== Unchecked Exception Method ===" yazdırın
// Bir try-catch bloğu içinde AgeVerifier.verifyAgeUncheckedOnly(age) metodunu çağırın
// - NegativeAgeException yakala: "Runtime exception caught: [mesaj]" yazdır
// - IllegalArgumentException yakala: "Illegal argument caught: [mesaj]" yazdı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ı