Menu
CoddyTech

Integrasi Penanganan Pengecualian

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 82 dari 87.

challenge icon

Tantangan

Mudah

Mari buat Library Management System-mu lebih tangguh dengan mengintegrasikan penanganan exception yang tepat! Sistem perpustakaan sungguhan perlu menangani kondisi error dengan baik: apa yang terjadi saat seseorang mencoba meminjam buku yang tidak ada, atau saat pengguna mencoba meminjam lebih banyak buku daripada batas yang diizinkan? Kamu akan membuat exception khusus yang memberikan masukan yang bermakna untuk situasi ini.

Kamu akan melanjutkan pengembangan kode yang sudah ada di enam file:

  • Book.java: Pertahankan class Book-mu dengan semua fungsi yang sudah ada: isbn, title, author, isAvailable, borrowedBy, getDetails(), serta getter/setter yang sesuai.
  • User.java: Pertahankan class User-mu dengan id, name, ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount(), dan toString().
  • LibraryException.java: Buat class exception khusus dasar bernama LibraryException yang memperluas Exception. Class ini akan menjadi class induk untuk semua exception khusus perpustakaan. Sertakan constructor yang menerima pesan dan meneruskannya ke class induk.
  • BookNotAvailableException.java: Buat exception khusus yang memperluas LibraryException. Exception ini harus dilempar saat seseorang mencoba meminjam buku yang sudah dipinjam. Sertakan constructor yang menerima ISBN buku dan membuat pesan yang bermakna seperti Book not available: [isbn].
  • Library.java: Perbarui class Library-mu agar melempar exception alih-alih mencetak pesan error. Ubah method borrowBook(String userId, String isbn) agar:
    • Melempar LibraryException dengan pesan User not found: [userId] jika pengguna tidak ada
    • Melempar LibraryException dengan pesan Book not found: [isbn] jika buku tidak ada
    • Melempar BookNotAvailableException jika buku sudah dipinjam
    • Jika berhasil, membuat pengguna meminjam buku dan mengembalikan pesan konfirmasi [userName] borrowed [bookTitle]

    Ubah tanda tangan method menjadi throws LibraryException dan ubah tipe kembalian menjadi String.

    Pastikan semua method lain (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) tetap berfungsi seperti sebelumnya.

  • Main.java: Tunjukkan penanganan exception-mu! Kamu akan menerima string berisi perintah yang dipisahkan koma. Setiap perintah mengikuti salah satu format berikut:
    • ADD_BOOK:isbn:title:author
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Proses setiap perintah. Untuk ADD_BOOK, cetak Added: [title]. Untuk REGISTER_USER, cetak Registered: [name]. Untuk perintah BORROW, gunakan blok try-catch untuk menangani exception. Jika berhasil, cetak pesan konfirmasi. Jika terjadi LibraryException, cetak Error: [exception message].

    Setelah memproses semua perintah, cetak Operations completed.

Kamu akan menerima satu input: string berisi perintah yang dipisahkan koma.

Contohnya, dengan input ADD_BOOK:ISBN-001:Clean Code:Robert Martin,REGISTER_USER:U001:Alice,BORROW:U001:ISBN-001,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001, output-mu akan menjadi:

Added: Clean Code
Registered: Alice
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Error: User not found: U002
Operations completed

Perhatikan bagaimana exception khusus memberikan pesan error yang jelas dan spesifik. Peminjaman pertama berhasil, peminjaman kedua gagal karena buku sudah dipinjam (BookNotAvailableException), dan peminjaman ketiga gagal karena pengguna U002 tidak ada (LibraryException). Pendekatan ini membuat sistem perpustakaanmu memberikan lebih banyak informasi dan lebih mudah di-debug daripada pesan error umum!

Coba sendiri

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Baca perintah yang dipisahkan koma
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Buat Library dan AdminService
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // Proses setiap perintah
        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: Gunakan blok try-catch untuk memanggil library.borrowBook(userId, isbn)
                // Jika berhasil, cetak pesan konfirmasi yang dikembalikan
                // Jika terjadi LibraryException, cetak "Error: " + e.getMessage()
            }
        }
        
        // TODO: Cetak "Operations completed"
    }
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online