Menu
Coddy logo textTech

Exception Handling Entegrasyonu

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 82 / 87.

challenge icon

Görev

Kolay

Uygun 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: Exception sınıfını genişleten LibraryException adı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: LibraryException sı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 ve Book 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ıyla LibraryException fırlatın
    • Kitap mevcut değilse Book not found: [isbn] mesajıyla LibraryException fırlatın
    • Kitap zaten ödünç alınmışsa BookNotAvailableException fı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 LibraryException olarak ve dönüş türünü String olarak 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.

  • 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:author
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Her komutu işleyin. ADD_BOOK için Added: [title] yazdırın. REGISTER_USER için Registered: [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 bir LibraryException durumunda Error: [exception message] yazdırın.

    Tüm komutları işledikten sonra Operations completed yazdı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