Ö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.
Görev
KolayFarklı 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 (Exceptionsınıfını extends eder). İstisnan, constructor'ında bir message kabul etmeli vesuper(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 (RuntimeExceptionsı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 birTicketSoldOutExceptionfırlat. Koltuk number'ı 1'den küçük veya toplam koltuk sayısından büyükse, message olarak"Seat [seatNumber] does not exist"ile birInvalidSeatExceptionfırlat. Otherwise, available koltuk sayısını 1 azalt veBooked seat [seatNumber] successfullyyazdı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
TicketBootholuştur. Ardından belirtilen koltuk number'ını bir try-catch block'u içinde rezerve etmeyi attempt et.TicketSoldOutExceptionchecked olduğu için onu handle etmen must. ÖnceTicketSoldOutException'ı yakala veBooking failed: [exception message]yazdır. ArdındanInvalidSeatException'ı 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]"
}
}
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