← Назад к вопросам

Какой механизм обработки исключений?

1.0 Junior🔥 211 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Механизм обработки исключений в Java

Обработка исключений в Java основана на механизме throw-catch-finally, который позволяет контролировать потоки выполнения при возникновении ошибок.

Иерархия исключений

Все исключения наследуются от класса Throwable:

Throwable
├── Error (невосстанавливаемые ошибки: StackOverflowError, OutOfMemoryError)
└── Exception
    ├── Checked Exceptions (IOException, SQLException)
    └── Unchecked Exceptions (RuntimeException)
        ├── NullPointerException
        ├── ArrayIndexOutOfBoundsException
        ├── ArithmeticException

Checked vs Unchecked Exceptions

Checked Exceptions — компилятор обязывает обработать:

public void readFile(String filename) throws IOException {
    FileReader reader = new FileReader(filename); // throws IOException
    // Обязательно должны либо catch'ить, либо throws'ить
}

Unchecked Exceptions — необязательно обрабатывать:

public void divide(int a, int b) {
    int result = a / b; // может выбросить ArithmeticException
    // Компилятор не обязывает обработать
}

Try-Catch механизм

Перехват исключения с помощью try-catch:

try {
    int[] numbers = new int[5];
    numbers[10] = 5; // выбросит ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("Ошибка индекса: " + e.getMessage());
}

Множественная обработка:

try {
    // рискованный код
} catch (FileNotFoundException e) {
    System.out.println("Файл не найден");
} catch (IOException e) {
    System.out.println("Ошибка ввода-вывода");
} catch (Exception e) {
    System.out.println("Другая ошибка");
}

Finally блок

Finally выполняется всегда, даже если произошло исключение:

FileReader reader = null;
try {
    reader = new FileReader("data.txt");
    // работа с файлом
} catch (IOException e) {
    System.out.println("Ошибка: " + e);
} finally {
    if (reader != null) {
        reader.close(); // ВСЕГДА выполнится
    }
}

Try-with-resources (Java 7+)

Автоматическое закрытие ресурсов:

try (FileReader reader = new FileReader("data.txt")) {
    // работа с reader
} catch (IOException e) {
    System.out.println("Ошибка: " + e);
}
// reader автоматически закроется

Throws и throw

throws — объявляет, что метод может выбросить исключение:

public void connectToDatabase() throws SQLException, IOException {
    // метод может выбросить эти исключения
}

throw — явно выбрасывает исключение:

public void validateAge(int age) {
    if (age < 0) {
        throw new IllegalArgumentException("Возраст не может быть отрицательным");
    }
}

Кастомные исключения

public class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

public class BankAccount {
    private double balance;
    
    public void withdraw(double amount) throws InsufficientFundsException {
        if (amount > balance) {
            throw new InsufficientFundsException("Недостаточно средств");
        }
        balance -= amount;
    }
}

Exception chaining (цепочка исключений)

Передача оригинального исключения в контексте нового:

try {
    readFile("data.txt");
} catch (IOException e) {
    throw new DataProcessingException("Не удалось обработать данные", e);
}

Порядок выполнения

try {
    System.out.println("1. Начало try");
    int x = 10 / 0; // исключение
    System.out.println("2. Конец try"); // НЕ выполнится
} catch (ArithmeticException e) {
    System.out.println("3. Catch блок"); // выполнится
} finally {
    System.out.println("4. Finally блок"); // ВСЕГДА выполнится
}
System.out.println("5. После try-catch-finally"); // выполнится

// Вывод:
// 1. Начало try
// 3. Catch блок
// 4. Finally блок
// 5. После try-catch-finally

Лучшие практики

  1. Ловите специфичные исключения — не ловите Exception общо
  2. Логируйте исключения — используйте logger, а не System.out
  3. Не подавляйте исключения — catch пустой блок это очень плохо
  4. Используйте try-with-resources — для автоматического закрытия ресурсов
  5. Выбрасывайте кастомные исключения — для лучшей обработки в бизнес-логике
// Плохо
try {
    // ...
} catch (Exception e) {
    // молчание
}

// Хорошо
try {
    // ...
} catch (IOException e) {
    logger.error("Ошибка при чтении файла: {}", e.getMessage(), e);
    throw new DataProcessingException("Не удалось обработать данные", e);
}

Механизм исключений в Java позволяет контролировать ошибки и обеспечивает предсказуемое поведение приложения при проблемах.

Какой механизм обработки исключений? | PrepBro