Являются ли исключения типа Error в Java проверяемыми (checked)?

Ответ

Нет. Исключения, унаследованные от класса java.lang.Error, являются непроверяемыми (unchecked).

Краткое объяснение иерархии:

Throwable
├── Error (Unchecked) — e.g., OutOfMemoryError, StackOverflowError
└── Exception
    ├── RuntimeException (Unchecked) — e.g., NullPointerException
    └── Все остальные (Checked) — e.g., IOException
Ключевые отличия Error от checked исключений: Критерий Checked Exception (e.g., IOException) Error (e.g., OutOfMemoryError)
Обработка компилятором Требует try-catch или throws Не требует
Природа Восстановимые условия, ожидаемые в работе приложения Критические, часто невосстановимые сбои системы или JVM
Цель обработки Восстановление нормального потока выполнения Как правило, корректное завершение работы приложения

Пример кода:

// Компиляция пройдёт успешно. Объявлять 'throws' для Error не обязательно.
public void causeFatalError() {
    throw new LinkageError("Несовместимость классов");
}

// Для сравнения: checked исключение БУДЕТ требовать обработки.
public void readFile() throws IOException { // 'throws' ОБЯЗАТЕЛЕН
    Files.readAllBytes(Paths.get("file.txt"));
}

Ответ 18+ 🔞

Да ты посмотри на эту иерархию, блядь! Прямо как генеалогическое древо какого-нибудь ёбаного дворянского рода, только вместо князей и графьев — исключения.

Смотри, есть Throwable — это типа прародитель, патриарх, с которого всё началось. А от него уже два отпрыска пошли, как два брата, но судьба у них разная, пиздец.

Первый брат — Exception. Ну, это такой правильный, воспитанный. Его дети, RuntimeException и всякие IOException — они, конечно, могут накосячить, но это в рамках приличий. С ними можно договориться, обернуть в try-catch, как в одеяло, и успокоить. Компилятор за ними, как нянька, следит: «А ты обработал? А ты объявил throws? А то не пущу!». Checked они, блядь.

А вот второй брат — Error. Это уже, сука, отбитый на всю голову, анархист. Его дети — OutOfMemoryError, StackOverflowError. Это не ошибки программы — это пиздец, апокалипсис, конец света в отдельно взятой JVM. Память кончилась? Ну всё, пиши пропало. Стек переполнился? Да хуй его знает, что там наворотили. Восстанавливаться? Да какое, на хуй, восстановление!

И главная фишка в том, что компилятор, видя Error, просто разводит руками и говорит: «Ну, братан, это твои проблемы. Хочешь — лови, не хочешь — не надо. Я тебя заставлять не буду, это ж unchecked». Потому что что с ним делать-то? Ну поймал ты VirtualMachineError. И чё? Приложение всё равно в говне. Лучше уж дать ему достойно сдохнуть и записать в лог предсмертную записку.

Вот смотри на пример, тут вся суть:

// Смотри, какая власть. Кидаю LinkageError, а компилятор даже не пикнет.
// Никаких 'throws', нихуя. Потому что это Error — царь и бог, ему закон не писан.
public void causeFatalError() {
    throw new LinkageError("Библиотеки поссорились, несовместимы, пиздец");
}

// А вот тут попробуй не объяви 'throws IOException'!
// Компилятор сразу: «Э, сука, стопэ! Куда это ты файл собрался читать без разрешения? Объявляй или лови!».
public void readFile() throws IOException { // Без этой строчки — никуда.
    Files.readAllBytes(Paths.get("file.txt"));
}

Короче, запомни: Error — это как удар молнии в жопу. Его не предскажешь, от него не защитишься, и пытаться его «обработать» — это как пытаться собрать разбитую тарелку суперклеем. Бесполезная хуйня. Лови только для того, чтобы перед смертью красиво записать «Прощай, жестокий мир!» в лог и завершиться с кодом 1.