Menu
Coddy logo textTech

Özel İstisnalar

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 60 / 87.

Java'nın yerleşik istisnaları birçok yaygın hata senaryosunu kapsar, ancak bazen uygulamanızın alanına özgü istisnalara ihtiyaç duyarsınız. custom exceptions, neyin yanlış gittiğini açıkça ifade eden anlamlı hata türleri oluşturmanıza olanak tanır.

Özel bir exception oluşturmak için mevcut bir exception class'ını basitçe genişletin. checked bir exception için Exception sınıfını extends edin:

public class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

Denetlenmeyen bir istisna için RuntimeException sınıfını genişletin:

public class InvalidAgeException extends RuntimeException {
    public InvalidAgeException(String message) {
        super(message);
    }
}

super(message) çağrısı, hata mesajını üst sınıfa aktararak mesajın getMessage() aracılığıyla kullanılabilir olmasını sağlar. Ardından custom exception'ınızı diğerleri gibi fırlatabilir ve catch edebilirsiniz:

public void withdraw(double amount) throws InsufficientFundsException {
    if (amount > balance) {
        throw new InsufficientFundsException("Balance too low: " + balance);
    }
    balance -= amount;
}

// Kullanımı
try {
    account.withdraw(1000);
} catch (InsufficientFundsException e) {
    System.out.println(e.getMessage());
}

Özel istisnalar, kodunuzu daha okunabilir hâle getirir ve çağıranların belirli hata koşullarını farklı şekilde ele almasına olanak tanır. Açık hata iletişiminin önemli olduğu API'ler veya kütüphaneler oluştururken özellikle değerlidir.

challenge icon

Görev

Kolay

Farklı hata senaryolarını yönetmek için özel istisnalar kullanan bir bilet rezervasyon sistemi oluşturalım! Bilet rezervasyonu sırasında neyin yanlış gittiğini açıkça ifade eden anlamlı istisna türleri oluşturacaksın.

Kodunu dört dosya arasında düzenleyeceksin:

  • TicketSoldOutException.java: Biletlerin artık available olmadığı durumlar için özel bir checked exception oluştur ( Exception sınıfını extends eder). İstisnan, constructor'ında bir message kabul etmeli ve super(message) kullanarak bunu üst sınıfa aktarmalıdır.
  • InvalidSeatException.java: Birisi geçersiz bir koltuk number'ı rezerve etmeye çalıştığında kullanılmak üzere özel bir unchecked exception oluştur ( RuntimeException sınıfını extends eder). Bu istisna da bir message kabul etmeli ve bunu üst sınıfına aktarmalıdır.
  • TicketBooth.java: Bilet satışlarını manages eden bir class oluştur. booth'un toplam available koltuk sayısını ve geçerli en yüksek koltuk number'ını takip etmesini sağla. Şunları ekle:

    Available toplam koltuk sayısını alan bir constructor.

    Rezervasyonu doğrulayan bir bookTicket(int seatNumber) method'u. Hiç bilet kalmadıysa (available koltuk sayısı 0 veya daha azsa), message olarak "No tickets remaining" ile bir TicketSoldOutException fırlat. Koltuk number'ı 1'den küçük veya toplam koltuk sayısından büyükse, message olarak "Seat [seatNumber] does not exist" ile bir InvalidSeatException fırlat. Otherwise, available koltuk sayısını 1 azalt ve Booked seat [seatNumber] successfully yazdır.

    Mevcut available koltuk sayısını döndüren bir getAvailableSeats() method'u.

  • Main.java: Bilet sistemini bir araya getir! İki girdi alacaksın: toplam koltuk sayısı ve rezerve edilecek bir koltuk number'ı.

    Verilen toplam koltuk sayısıyla bir TicketBooth oluştur. Ardından belirtilen koltuk number'ını bir try-catch block'u içinde rezerve etmeyi attempt et. TicketSoldOutException checked olduğu için onu handle etmen must. Önce TicketSoldOutException'ı yakala ve Booking failed: [exception message] yazdır. Ardından InvalidSeatException'ı yakala ve aynı formatı yazdır: Booking failed: [exception message].

    Try-catch block'undan After, getter method'unu kullanarak Remaining seats: [count] yazdır.

İki girdiyi şu sırayla alacaksın: toplam koltuk sayısı (integer) ve rezerve edilecek koltuk number'ı (integer).

Checked exception'ların çağıranları bunları (try-catch veya throws ile) handle etmeye zorladığına, unchecked exception'ların ise açıkça handle edilmeyi gerektirmediğine dikkat et. Exception türünü, hatanın çağıranların önceden bekleyip toparlanması gereken bir şey olup olmadığına göre seç!

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int totalSeats = scanner.nextInt();
        int seatNumber = scanner.nextInt();
        
        // TODO: Verilen toplam koltuklarla bir TicketBooth oluştur
        
        // TODO: Koltuğu rezerve etmeyi denemek için bir try-catch bloğu kullan
        // - Önce TicketSoldOutException yakala ve "Booking failed: [exception message]" yazdır
        // - InvalidSeatException yakala ve "Booking failed: [exception message]" yazdır
        
        // TODO: After the try-catch, print "Remaining seats: [count]"
    }
}
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