Короткий ответ
Exception и Error — наследники Throwable, но это разные классы проблем. Exception — событие, нарушающее нормальный ход программы, которое в большинстве случаев можно перехватить через try-catch и восстановить работу. Error — серьёзная проблема уровня JVM или окружения: приложение обычно не в силах с ней справиться, поэтому ловить Error не принято.
Как это работает подробнее
Exception описывает события, нарушающие нормальный ход программы, но в большинстве случаев восстановимые: IOException, SQLException (checked), а также RuntimeException и её наследники. Перехватив такое исключение через try-catch, программа обычно может продолжить работу.
Error — это критические проблемы уровня JVM или окружения: OutOfMemoryError, StackOverflowError, NoClassDefFoundError, AssertionError. Дальнейшая стабильная работа часто невозможна, поэтому «чинить» их в коде не принято — нужны другие настройки JVM, исправление кода или инфраструктуры. Технически перехватить Error можно (он наследник Throwable), но делать это крайне не рекомендуется.
- Правило:
Exception— проблемы, которые программа может и должна обрабатывать;Error— проблемы, которые она обрабатывать не обязана и обычно не может.
Пример кода
import java.io.IOException;
public class ExceptionVsError {
public static void main(String[] args) {
try {
throw new IOException("сеть недоступна");
} catch (IOException e) {
System.out.println("Exception обработана, работаем дальше");
}
// Error (например, OutOfMemoryError) обычно не ловят:
// его причина — состояние JVM, а не логика приложения
}
}Что использовать на практике
- Ловите только те исключения, после которых программа может осмысленно продолжить работу.
Error(OutOfMemoryError,StackOverflowError) вcatchне обрабатывайте — причина обычно в настройках JVM, коде или окружении.- Держитесь за иерархию: ловите конкретные подклассы
Exception, а неThrowable.
Подводные камни
catch (Throwable e)перехватит иError— можно замаскировать фатальный сбой и оставить систему в нестабильном состоянии.OutOfMemoryErrorспособен возникнуть где угодно, в том числе внутри блокаcatch, — гарантий продолжения нет.- Не расширяйте
Errorсобственными классами: ошибки приложения моделируются через иерархиюException.
Как отвечать на собеседовании
- Каркас: назовите общего предка
Throwable→ определитеExceptionкак восстановимые сбои приложения →Errorкак фатальные проблемы уровня JVM → приведите по 2 примера из каждой группы → сделайте вывод: Exception ловить и обрабатывать, Error — не принято.