Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Является ли Error проверяемыми исключениями?
Нет, Error НЕ являются проверяемыми исключениями (checked exceptions). Это один из самых важных моментов в иерархии исключений Java. Давайте разберёмся подробно.
Иерархия исключений в Java
Throwable
├── Exception (проверяемые и непроверяемые)
│ ├── IOException (проверяемое)
│ ├── SQLException (проверяемое)
│ ├── RuntimeException (непроверяемое)
│ │ ├── NullPointerException
│ │ ├── IndexOutOfBoundsException
│ │ └── ArithmeticException
│ └── CustomException (может быть проверяемым)
└── Error (ВСЕГДА непроверяемое!)
├── OutOfMemoryError
├── StackOverflowError
├── VirtualMachineError
└── AssertionError
Ключевая разница
Checked Exception — должны быть обработаны или объявлены в throws:
public void readFile() throws IOException { // ОБЯЗАТЕЛЬНО объявить!
FileInputStream fis = new FileInputStream("file.txt");
// IOException - проверяемое исключение
}
public void someMethod() {
try {
readFile();
} catch (IOException e) {
e.printStackTrace();
}
}
Unchecked Exception (включая Error) — не требуют обработки:
public void riskyCast() {
Object obj = "Hello";
Integer number = (Integer) obj; // ClassCastException - непроверяемое
// Компилятор не требует throws или try-catch
}
public void divideByZero() {
int result = 10 / 0; // ArithmeticException - непроверяемое
}
public void outOfMemory() {
// OutOfMemoryError - ВСЕГДА непроверяемое
int[] huge = new int[Integer.MAX_VALUE];
}
Error — это непроверяемые исключения
Error представляют серьёзные проблемы, которые программист НЕ должен пытаться обработать:
public void badPractice() {
try {
// ❌ ПЛОХО - ловить Error
throw new OutOfMemoryError();
} catch (Error e) {
// Это не рекомендуется делать!
System.out.println("Caught error");
}
}
public void goodPractice() throws OutOfMemoryError {
// ✅ ХОРОШО - не ловить Error, позволить JVM его обработать
throw new OutOfMemoryError("No memory left");
}
Типы Error
// 1. OutOfMemoryError - памяти недостаточно
public void memoryError() {
List<byte[]> list = new ArrayList<>();
while (true) {
list.add(new byte[1024 * 1024]); // OutOfMemoryError
}
}
// 2. StackOverflowError - переполнение стека вызовов
public void stackError() {
stackError(); // Бесконечная рекурсия - StackOverflowError
}
// 3. VirtualMachineError - ошибка JVM
// NoClassDefFoundError - класс не найден
// InternalError - внутренняя ошибка JVM
// 4. AssertionError - assertion failure
public void assertionError() {
assert false : "This should not happen"; // AssertionError
}
// 5. ThreadDeath - поток завершается
// LinkageError - ошибка связывания классов
Проверяемые vs Непроверяемые
| Тип | Наследник | Требует обработки? | Пример |
|---|---|---|---|
| Checked | Exception (кроме RuntimeException) | ДА | IOException, SQLException |
| Unchecked | RuntimeException | НЕТ | NullPointerException, ArithmeticException |
| Error | Error | НЕТ | OutOfMemoryError, StackOverflowError |
Почему Error не ловят?
public void badError() {
try {
// Если здесь OutOfMemoryError,
// то дальше код может работать непредсказуемо
someMethod();
} catch (OutOfMemoryError e) {
// Всё равно нельзя гарантировать корректность
System.out.println("Out of memory");
}
}
public void rightApproach() throws Exception {
// Лучше дать JVM обработать Error
// Программа закроется, но gracefully
someMethod();
}
Проверка компилятором
// ✅ СКОМПИЛИРУЕТСЯ - IOException не обработана, но объявлена в throws
public void method1() throws IOException {
FileInputStream fis = new FileInputStream("file.txt");
}
// ✅ СКОМПИЛИРУЕТСЯ - Error не требует обработки
public void method2() {
throw new OutOfMemoryError();
}
// ❌ НЕ СКОМПИЛИРУЕТСЯ - IOException не обработана и не в throws
public void method3() {
FileInputStream fis = new FileInputStream("file.txt");
// compile error: Unhandled exception type IOException
}
Заключение
- Error НЕ являются проверяемыми исключениями
- Error всегда непроверяемые (unchecked)
- Error представляют серьёзные проблемы, которые программист не должен обрабатывать
- Checked — Exception (кроме RuntimeException): IOException, SQLException
- Unchecked — RuntimeException: NullPointerException, ArithmeticException
- Unchecked — Error: OutOfMemoryError, StackOverflowError
Это критическое знание для правильной обработки исключений в Java.