Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Checked 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ğrudan Exception sı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 istisna RuntimeException sı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, NegativeAgeException mesajıyla "Age cannot be negative: [age]" (unchecked) fırlatmalı. Yaş 18'den küçükse InvalidAgeException mesajıyla "Must be 18 or older: [age]" (checked) fırlatmalı. Aksi takdirde Age [age] verified successfully yazdırmalı. Bu metot checked bir istisna fırlattığından, metodu throws InvalidAgeException ile bildirmelisin.

    verifyAgeUncheckedOnly(int age) - Bu metot yalnızca unchecked istisnalar kullanır. Yaş negatifse aynı mesaj biçimiyle NegativeAgeException fırlatmalı. Yaş 18'den küçükse IllegalArgumentException mesajıyla bir "Too young: [age]" fırlatmalı. Aksi takdirde Age [age] verified (unchecked method) yazdırmalı. Bu metodun herhangi bir throws bildirimi 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şıyla verifyAge metodunu çağır. Bu metot checked bir istisna fırlattığından, çağrıyı bir try-catch içine almalısın. InvalidAgeException yakala ve Checked exception caught: [message] yazdır. Ayrıca NegativeAgeException yakala ve Unchecked exception caught: [message] yazdır.

    Ardından boş bir satır ve === Unchecked Exception Method === yazdır. Aynı yaşla verifyAgeUncheckedOnly metodunu ç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. NegativeAgeException yakala ve Runtime exception caught: [message] yazdır. IllegalArgumentException yakala ve Illegal 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]"
        
    }
}
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

Kendi başına pratik yap: Online Java derleyicisi