Перейти к основному содержимому

Будет ли ошибка обнаружена блоком Catch в Java?

· 2 мин. чтения

1. Обзор

В этой короткой статье мы покажем, как правильно отлавливать ошибки Java, и объясним, когда это не имеет смысла.

Подробную информацию о Throwable s в Java см. в нашей статье об обработке исключений в Java .

2. Отлов ошибок

Поскольку класс java.lang.Error в Java не наследуется от java.lang.Exception , мы должны объявить базовый класс Error — или конкретный подкласс Error , который мы хотим захватить — в операторе catch, чтобы его перехватить. .

Следовательно, если мы запустим следующий тестовый пример, он пройдет:

@Test(expected = AssertionError.class)
public void whenError_thenIsNotCaughtByCatchException() {
try {
throw new AssertionError();
} catch (Exception e) {
Assert.fail(); // errors are not caught by catch exception
}
}

Однако следующий модульный тест ожидает, что оператор catch поймает ошибку:

@Test
public void whenError_thenIsCaughtByCatchError() {
try {
throw new AssertionError();
} catch (Error e) {
// caught! -> test pass
}
}

Обратите внимание, что виртуальная машина Java выдает ошибки, указывающие на серьезные проблемы, от которых она не может избавиться , например, нехватка памяти и переполнение стека.

Таким образом , у нас должна быть очень и очень веская причина поймать ошибку!

3. Заключение

В этой статье мы увидели, когда и как Error можно перехватывать в Java. Пример кода можно найти в проекте GitHub .