Ö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 net bir şekilde ileten 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. Denetlenen (checked) bir istisna için Exception sınıfını genişletin:
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}Kontrol edilmeyen 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 kullanılabilir hale getirir. Daha sonra kendi özel istisnanızı diğerleri gibi fırlatabilir ve 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 hale getirir ve çağıranların belirli hata durumlarını farklı şekilde ele almasına olanak tanır. Özellikle net hata iletişiminin önemli olduğu API'ler veya kütüphaneler oluştururken değerlidirler.
Görev
KolayFarklı hata senaryolarını yönetmek için özel istisnalar (custom exceptions) kullanan bir bilet rezervasyon sistemi oluşturalım! Bilet rezervasyonu sırasında neyin yanlış gittiğini net bir şekilde ileten anlamlı istisna türleri oluşturacaksınız.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
TicketSoldOutException.java: Biletler artık mevcut olmadığında kullanılacak özel bir denetimli istisna (checked exception -Exceptionsınıfını genişletir) oluşturun. İstisnanız, yapılandırıcısında (constructor) bir mesaj kabul etmeli ve bunusuper(message)kullanarak üst sınıfa iletmelidir.InvalidSeatException.java: Birisi geçersiz bir koltuk numarası rezerve etmeye çalıştığında kullanılacak özel bir denetimsiz istisna (unchecked exception -RuntimeExceptionsınıfını genişletir) oluşturun. Bu istisna da bir mesaj kabul etmeli ve bunu üst sınıfına iletmelidir.TicketBooth.java: Bilet satışlarını yöneten bir sınıf oluşturun. Gişeniz (booth), toplam mevcut koltuk sayısını ve en yüksek geçerli koltuk numarasını takip etmelidir. Şunları içermelidir:Mevcut toplam koltuk sayısını alan bir yapılandırıcı (constructor).
Rezervasyonu doğrulayan bir
bookTicket(int seatNumber)metodu. Hiç bilet kalmadıysa (mevcut koltuklar 0 veya daha azsa),"No tickets remaining"mesajıyla birTicketSoldOutExceptionfırlatın. Koltuk numarası 1'den küçük veya toplam koltuk sayısından büyükse,"Seat [seatNumber] does not exist"mesajıyla birInvalidSeatExceptionfırlatın. Aksi takdirde, mevcut koltuk sayısını 1 azaltın veBooked seat [seatNumber] successfullyyazdırın.Mevcut koltuk sayısını döndüren bir
getAvailableSeats()metodu.Main.java: Bilet sisteminizi bir araya getirin! İki girdi alacaksınız: toplam koltuk sayısı ve rezerve edilecek koltuk numarası.Verilen toplam koltuk sayısıyla bir
TicketBootholuşturun. Ardından, bir try-catch bloğu içinde belirtilen koltuk numarasını rezerve etmeye çalışın.TicketSoldOutExceptiondenetimli (checked) bir istisna olduğu için onu ele almanız gerekir. ÖnceTicketSoldOutExceptionistisnasını yakalayın veBooking failed: [exception message]yazdırın. ArdındanInvalidSeatExceptionistisnasını yakalayın ve aynı formatta yazdırın:Booking failed: [exception message].Try-catch bloğundan sonra, getter metodunu kullanarak
Remaining seats: [count]yazdırın.
Sırasıyla iki girdi alacaksınız: toplam koltuk sayısı (tamsayı) ve rezerve edilecek koltuk numarası (tamsayı).
Denetimli istisnaların (checked exceptions) çağıranları bunları ele almaya (try-catch veya throws ile) nasıl zorladığına, denetimsiz istisnaların (unchecked exceptions) ise açıkça ele alınmasının gerekmediğine dikkat edin. İstisna türünü, hatanın çağıranların öngörmesi ve düzeltmesi gereken bir şey olup olmadığına göre seçin!
Kopya kağıdı
Bir özel istisna (custom exception) oluşturmak için mevcut bir istisna sınıfını genişletin.
Bir denetimli istisna (checked exception) için Exception sınıfını genişletin:
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}Bir denetimsiz istisna (unchecked exception) 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 bu mesajın getMessage() aracılığıyla kullanılabilir olmasını sağlar.
Özel istisnaları diğer tüm istisnalar gibi fırlatın (throw) ve yakalayın (catch):
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
throw new InsufficientFundsException("Balance too low: " + balance);
}
balance -= amount;
}
// Using it
try {
account.withdraw(1000);
} catch (InsufficientFundsException e) {
System.out.println(e.getMessage());
}Denetimli istisnalar, çağıranları bunları try-catch veya throws ile ele almaya zorlar. Denetimsiz istisnalar ise açıkça ele alma gerektirmez. Seçiminizi, hatanın çağıranların öngörmesi ve kurtulması gereken bir durum olup olmadığına göre yapın.
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 koltuk sayısıyla bir TicketBooth oluşturun
// TODO: Koltuk rezervasyonu yapmayı denemek için bir try-catch bloğu kullanın
// - Önce TicketSoldOutException yakalayın ve "Booking failed: [exception message]" yazdırın
// - InvalidSeatException yakalayın ve "Booking failed: [exception message]" yazdırın
// TODO: try-catch bloğundan sonra, "Remaining seats: [count]" yazdırın
}
}
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ı