Exception Handling Entegrasyonu
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 82 / 87.
Görev
KolayUygun istisna yönetimi (exception handling) entegre ederek Kütüphane Yönetim Sisteminizi daha sağlam hale getirelim! Gerçek bir kütüphane sisteminin hata durumlarını zarif bir şekilde ele alması gerekir; birisi var olmayan bir kitabı ödünç almaya çalıştığında veya bir kullanıcı izin verilenden daha fazla kitap ödünç almaya çalıştığında ne olur? Bu senaryolar için anlamlı geri bildirim sağlayan özel istisnalar oluşturacaksınız.
Mevcut kodunuzu altı dosya üzerinde oluşturmaya devam edeceksiniz:
Book.java: Book sınıfınızı tüm mevcut işlevleriyle (isbn, title, author, isAvailable, borrowedBy, getDetails() ve uygun getter/setter metotları) koruyun.User.java: User sınıfınızı id, name, borrowedBooks ArrayList, borrowBook(), returnBook(), getBorrowedCount() ve toString() ile koruyun.LibraryException.java:Exceptionsınıfını genişletenLibraryExceptionadında temel bir özel istisna sınıfı oluşturun. Bu, kütüphaneye özgü tüm istisnaların üst sınıfı olacaktır. Bir mesaj kabul eden ve bunu üst sınıfa ileten bir yapıcı (constructor) ekleyin.BookNotAvailableException.java:LibraryExceptionsınıfını genişleten özel bir istisna oluşturun. Bu istisna, birisi zaten ödünç alınmış bir kitabı ödünç almaya çalıştığında fırlatılmalıdır. Kitabın ISBN'sini kabul eden veBook not available: [isbn]gibi anlamlı bir mesaj oluşturan bir yapıcı ekleyin.Library.java: Library sınıfınızı hata mesajları yazdırmak yerine istisnalar fırlatacak şekilde güncelleyin.borrowBook(String userId, String isbn)metodunu şu şekilde değiştirin:- Kullanıcı mevcut değilse
User not found: [userId]mesajıylaLibraryExceptionfırlatın - Kitap mevcut değilse
Book not found: [isbn]mesajıylaLibraryExceptionfırlatın - Kitap zaten ödünç alınmışsa
BookNotAvailableExceptionfırlatın - Başarılı olduğunda, kullanıcının kitabı ödünç almasını sağlayın ve
[userName] borrowed [bookTitle]onay mesajını döndürün
Metot imzasını
throws LibraryExceptionolarak ve dönüş türünüStringolarak değiştirin.Diğer tüm metotların (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) eskisi gibi çalışmasını sağlayın.
- Kullanıcı mevcut değilse
Main.java: İstisna yönetiminizi gösterin! Virgülle ayrılmış bir komut dizisi alacaksınız. Her komut şu formatlardan birini izler:ADD_BOOK:isbn:title:authorREGISTER_USER:id:nameBORROW:userId:isbn
Her komutu işleyin. ADD_BOOK için
Added: [title]yazdırın. REGISTER_USER içinRegistered: [name]yazdırın. BORROW komutları için istisnaları ele almak üzere bir try-catch bloğu kullanın; başarı durumunda onay mesajını, herhangi birLibraryExceptiondurumundaError: [exception message]yazdırın.Tüm komutları işledikten sonra
Operations completedyazdırın.
Bir girdi alacaksınız: virgülle ayrılmış bir komut dizisi.
Örneğin, ADD_BOOK:ISBN-001:Clean Code:Robert Martin,REGISTER_USER:U001:Alice,BORROW:U001:ISBN-001,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001 girdisiyle çıktınız şöyle olacaktır:
Added: Clean Code
Registered: Alice
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Error: User not found: U002
Operations completedÖzel istisnaların nasıl net ve spesifik hata mesajları sağladığına dikkat edin. İlk ödünç alma başarılı olur, ikincisi kitap zaten ödünç alındığı için başarısız olur (BookNotAvailableException) ve üçüncüsü U002 kullanıcısı mevcut olmadığı için başarısız olur (LibraryException). Bu yaklaşım, kütüphane sisteminizi genel hata mesajlarından çok daha bilgilendirici ve hata ayıklaması daha kolay hale getirir!
Kendin dene
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Virgülle ayrılmış komutları oku
String input = scanner.nextLine();
String[] commands = input.split(",");
// Library ve AdminService oluştur
Library library = new Library();
AdminService adminService = new AdminService(library);
// Her bir komutu işle
for (String command : commands) {
String[] parts = command.split(":");
String operation = parts[0];
if (operation.equals("ADD_BOOK")) {
String isbn = parts[1];
String title = parts[2];
String author = parts[3];
if (adminService.addBook(isbn, title, author)) {
System.out.println("Added: " + title);
}
} else if (operation.equals("REMOVE_BOOK")) {
String isbn = parts[1];
if (adminService.removeBook(isbn)) {
System.out.println("Removed: " + isbn);
} else {
System.out.println("Cannot remove: " + isbn);
}
} else if (operation.equals("REGISTER_USER")) {
String id = parts[1];
String name = parts[2];
if (adminService.registerUser(id, name)) {
System.out.println("Registered: " + name);
}
} else if (operation.equals("BORROW")) {
String userId = parts[1];
String isbn = parts[2];
// TODO: library.borrowBook(userId, isbn) çağırmak için bir try-catch bloğu kullanın
// Başarılı olursa, dönen onay mesajını yazdırın
// LibraryException durumunda, "Error: " + e.getMessage() yazdırın
}
}
// TODO: "Operations completed" yazdırın
}
}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ı13Proje: Kütüphane Yönetimi
Proje Genel Bakış ve UML TasarımıKitap ve Kullanıcı Sınıfları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ı