Menu
Coddy logo textTech

Интеграция обработки исключений

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 82 из 87.

challenge icon

Задание

Легко

Давайте сделаем вашу систему управления библиотекой более надёжной, добавив правильную обработку исключений! Реальной библиотечной системе необходимо корректно обрабатывать ошибки: что произойдёт, если кто-то попытается взять несуществующую книгу или пользователь попытается взять больше книг, чем разрешено? Вы создадите пользовательские исключения, которые предоставляют понятную информацию в таких ситуациях.

Вы продолжите работать над существующим кодом в шести файлах:

  • Book.java: Сохраните свой класс Book со всей существующей функциональностью: isbn, title, author, isAvailable, borrowedBy, getDetails(), а также соответствующими геттерами и сеттерами.
  • User.java: Сохраните свой класс User с id, name, ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() и toString().
  • LibraryException.java: Создайте базовый пользовательский класс исключения под названием LibraryException, который расширяет Exception. Это будет родительский класс для всех исключений, специфичных для библиотеки. Добавьте конструктор, который принимает сообщение и передаёт его родительскому классу.
  • BookNotAvailableException.java: Создайте пользовательское исключение, которое расширяет LibraryException. Это исключение должно выбрасываться, когда кто-то пытается взять уже выданную книгу. Добавьте конструктор, который принимает ISBN книги и создаёт понятное сообщение, например Book not available: [isbn].
  • Library.java: Обновите свой класс Library, чтобы он выбрасывал исключения вместо вывода сообщений об ошибках. Измените метод borrowBook(String userId, String isbn) следующим образом:
    • Выбрасывайте LibraryException с сообщением User not found: [userId], если пользователь не существует
    • Выбрасывайте LibraryException с сообщением Book not found: [isbn], если книга не существует
    • Выбрасывайте BookNotAvailableException, если книга уже выдана
    • При успешном выполнении пользователь должен взять книгу, а метод — вернуть сообщение подтверждения [userName] borrowed [bookTitle]

    Измените сигнатуру метода на throws LibraryException, а возвращаемый тип — на String.

    Оставьте все остальные методы (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) работающими как прежде.

  • Main.java: Продемонстрируйте обработку исключений! Вы получите строку команд, разделённых запятыми. Каждая команда соответствует одному из следующих форматов:
    • ADD_BOOK:isbn:title:author
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Обработайте каждую команду. Для ADD_BOOK выведите Added: [title]. Для REGISTER_USER выведите Registered: [name]. Для команд BORROW используйте блок try-catch для обработки исключений: при успешном выполнении выведите сообщение подтверждения, а при любом LibraryException выведите Error: [exception message].

    После обработки всех команд выведите Operations completed.

Вы получите один входной параметр: строку команд, разделённых запятыми.

Например, при вводе ADD_BOOK:ISBN-001:Clean Code:Robert Martin,REGISTER_USER:U001:Alice,BORROW:U001:ISBN-001,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001 результатом будет:

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

Обратите внимание, как пользовательские исключения предоставляют ясные и конкретные сообщения об ошибках. Первая попытка взять книгу завершается успешно, вторая завершается ошибкой, поскольку книга уже выдана (BookNotAvailableException), а третья завершается ошибкой, поскольку пользователь U002 не существует (LibraryException). Такой подход делает вашу библиотечную систему гораздо более информативной и упрощает отладку по сравнению с общими сообщениями об ошибках!

Попробуйте сами

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

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Прочитать команды, разделённые запятыми
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Создать Library и AdminService
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // Обработать каждую команду
        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: Использовать блок try-catch для вызова library.borrowBook(userId, isbn)
                // При успехе вывести возвращённое сообщение подтверждения
                // При LibraryException вывести "Error: " + e.getMessage()
            }
        }
        
        // TODO: Print "Operations completed"
    }
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Java