ПрограммированиеBackend Java разработчик

Что такое исключения (exceptions) в Java? Объясните разницу между checked и unchecked exceptions и когда какую категорию использовать.

Проходите собеседования с ИИ помощником Hintsage

Ответ

Исключения (exceptions) — механизм обработки ошибок в Java. Каждый выбрасываемый объект — это производный класс от Throwable. Есть две основные категории:

  • Checked exceptions (потомки Exception, кроме RuntimeException): должны явно обрабатываться или объявляться в сигнатуре метода через throws.
  • Unchecked exceptions (потомки RuntimeException): обрабатывать явно не требуется, могут возникнуть в любом месте (например, NullPointerException).

Когда использовать?

  • Checked — для ожидаемых ошибок, которые можно обработать (например, файлы, сетевые ошибки).
  • Unchecked — для ошибок, свидетельствующих о программных дефектах (например, неправильный индекс массива).
Пример кода
public void readFile(String path) throws IOException { // Checked exception — требуется обработка Files.readAllLines(Paths.get(path)); } public void divide(int a, int b) { int c = a / b; // Unchecked — ArithmeticException }

Вопрос с подвохом

Может ли метод, не объявляющий throws, выбросить checked exception?

Ответ: Нет, компилятор не позволит выбрасывать checked exception без объявления в сигнатуре метода (throws). Но unchecked exception может быть выброшено без всякого предупреждения.

void foo() { throw new IOException(); // Ошибка компиляции }

Примеры реальных ошибок из-за незнания тонкостей темы


История

В интернет-банке заказчик решил игнорировать обработку SQLExceptions, используя unchecked-обёртки. Из-за этого при обновлении драйвера невидимые ошибки приводили к рассинхронизации данных.


История

В приложении логирования файл лога оставался заблокированным из-за неуловленного checked exception (FileNotFoundException), который "потеряли" в цепочке вызовов, ошибка не была обработана вовремя, и приложение не могло больше ничего писать в логи.


История

В торговой платформе команда внедрила глобальный catch(Throwable), чтобы "никогда не падать". В итоге критические unchecked-exceptions маскировались — приложение продолжало работать в неконсистентном состоянии, приводя к сложным багам и потерям данных.