Sobes.tech
Junior

Как правилно да хвърляме изключения в Java?

sobes.tech AI

Отговор от AI

Изключенията трябва да се хвърлят, когато възникне извънредна ситуация, която нарушава нормалното изпълнение на програмата и изисква незабавно обработване.

Основни принципи:

  • Използвайте изключения за съобщаване за грешки, а не за контрол на потока.
  • Изберете най-подходящия тип изключение от стандартната библиотека.
  • Създавайте свои собствени класове за изключения, когато стандартните не предоставят достатъчно информация.
  • Включвайте в съобщението за изключение подробна информация за причината за грешката, включително контекста.
  • Не прихващайте изключения, които не можете правилно да обработите. По-добре е да ги предадете по-нагоре по стековия ред.
  • Използвайте блокове try-with-resources за автоматично затваряне на ресурсите.
  • Записвайте в лог изключенията, които обработвате или предавате на по-високо ниво.

Правилният синтаксис: throw new MyException("Съобщение за грешка");

Пример:

// Създаване на собствено изключение
public class InvalidParameterException extends Exception {
    public InvalidParameterException(String message) {
        super(message);
    }
}

// Метод, който хвърля изключение
public int divide(int a, int b) throws InvalidParameterException {
    if (b == 0) {
        throw new InvalidParameterException("Деление на нула не е допустимо");
    }
    return a / b;
}

// Използване на метода и обработка на изключението
public void performDivision(int x, int y) {
    try {
        int result = divide(x, y);
        System.out.println("Резултат: " + result);
    } catch (InvalidParameterException e) {
        // Логване на грешката
        System.err.println("Грешка при делене: " + e.getMessage());
        // Възможна допълнителна обработка или предаване
    }
}

Разлики между Checked и Unchecked изключения:

Тип изключение Наследява от Изисква обработка/деклариране Пример
Checked Exception (освен RuntimeException) Да (try-catch или throws) IOException, SQLException
Unchecked RuntimeException Не (компилаторът не изисква) NullPointerException, ArrayIndexOutOfBoundsException