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. Özel istisnalar, neyin yanlış gittiğini açıkça anlatan anlamlı hata türleri oluşturmanıza olanak tanır.

Özel bir istisna oluşturmak için mevcut bir istisna sınıfını genişletmeniz yeterlidir. Denetimli bir istisna için Exception sınıfını genişletin:

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 ileterek getMessage() aracılığıyla erişilebilir olmasını sağlar. Ardından özel istisnanızı diğerleri gibi fırlatıp yakalayabilirsiniz:

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ı ele almak için özel istisnalar kullanan bir bilet rezervasyon sistemi oluşturalım! Bilet rezervasyonu yapılırken neyin yanlış gittiğini açıkça bildiren anlamlı istisna türleri oluşturacaksın.

Kodunu dört dosyaya ayıracaksın:

  • TicketSoldOutException.java: Biletler artık mevcut olmadığında kullanılacak özel bir checked exception oluştur ( Exception sınıfını genişletir). İstisnan, yapıcısında bir mesaj kabul etmeli ve bu mesajı super(message) kullanarak üst sınıfa aktarmalıdır.
  • InvalidSeatException.java: Birisi geçersiz bir koltuk numarasıyla rezervasyon yapmaya çalıştığında kullanılacak özel bir unchecked exception oluştur ( RuntimeException sınıfını genişletir). Bu istisna da bir mesaj kabul etmeli ve mesajı üst sınıfına aktarmalıdır.
  • TicketBooth.java: Bilet satışlarını yöneten bir sınıf oluştur. Gişen, kullanılabilir koltukların toplam sayısını ve geçerli en yüksek koltuk numarasını takip etmelidir. İçermesi gerekenler:

    Kullanılabilir toplam koltuk sayısını alan bir yapıcı.

    Rezervasyonu doğrulayan bir bookTicket(int seatNumber) metodu. Hiç bilet kalmadıysa (kullanılabilir koltuk sayısı 0 veya daha azsa), "No tickets remaining" mesajıyla bir TicketSoldOutException fırlat. Koltuk numarası 1'den küçükse veya toplam koltuk sayısından büyükse, "Seat [seatNumber] does not exist" mesajıyla bir InvalidSeatException fırlat. Aksi takdirde kullanılabilir koltuk sayısını 1 azalt ve Booked seat [seatNumber] successfully yazdır.

    Mevcut kullanılabilir koltuk sayısını döndüren bir getAvailableSeats() metodu.

  • Main.java: Bilet sistemini bir araya getir! İki girdi alacaksın: toplam koltuk sayısı ve rezervasyon yapılacak koltuk numarası.

    Verilen toplam koltuk sayısıyla bir TicketBooth oluştur. Ardından belirtilen koltuk numarasını bir try-catch bloğu içinde rezerve etmeyi dene. TicketSoldOutException checked olduğundan bunu ele almalısın. Önce TicketSoldOutException yakala ve Booking failed: [exception message] yazdır. Ardından InvalidSeatException yakala ve aynı biçimi kullanarak Booking failed: [exception message] yazdır.

    try-catch bloğundan sonra, getter metodunu kullanarak Remaining seats: [count] yazdır.

Sırasıyla iki girdi alacaksın: toplam koltuk sayısı (tamsayı) ve rezervasyon yapılacak koltuk numarası (tamsayı).

checked exception'ların çağıranları bunları (try-catch veya throws ile) ele almaya zorladığına, unchecked exception'ların ise açıkça ele alınmasını gerektirmediğine dikkat et! Hatanın çağıranların öngörmesi ve kurtulması gereken bir şey olup olmamasına göre istisna türünü 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