Короткий ответ
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, а не логика приложения
}
}