Ö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.
Görev
KolayFarklı 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 (Exceptionsı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 (RuntimeExceptionsı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 birTicketSoldOutExceptionfırlat. Koltuk numarası 1'den küçükse veya toplam koltuk sayısından büyükse,"Seat [seatNumber] does not exist"mesajıyla birInvalidSeatExceptionfırlat. Aksi takdirde kullanılabilir koltuk sayısını 1 azalt veBooked seat [seatNumber] successfullyyazdı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
TicketBootholuştur. Ardından belirtilen koltuk numarasını bir try-catch bloğu içinde rezerve etmeyi dene.TicketSoldOutExceptionchecked olduğundan bunu ele almalısın. ÖnceTicketSoldOutExceptionyakala veBooking failed: [exception message]yazdır. ArdındanInvalidSeatExceptionyakala ve aynı biçimi kullanarakBooking 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]"
}
}
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