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

Является ли Error проверяемыми?

2.0 Middle🔥 171 комментариев
#Основы Java

Комментарии (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 Непроверяемые

ТипНаследникТребует обработки?Пример
CheckedException (кроме RuntimeException)ДАIOException, SQLException
UncheckedRuntimeExceptionНЕТNullPointerException, ArithmeticException
ErrorErrorНЕТ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.

Является ли Error проверяемыми? | PrepBro