Непроверенные исключения - это исключения, которые не нужно перехватывать в блоке try
- catch
. Непроверенные исключения являются подклассами классов RuntimeException
или Error
.
Проверенные исключения - это исключения, которые необходимо перехватить в блоке try
- catch
.
Определение проверенных и непроверенных исключений можно найти в Раздел 11.2: Проверка исключений во время компиляции из Спецификация языка Java :
Классы непроверенных исключений
класс RuntimeException
и его
подклассы, а класс Error
и
его подклассы. Все остальные исключения
классы проверяются исключениями классов.
Только то, что непроверенное исключение перехвачено в блоке catch
, не делает его проверенным исключением - это просто означает, что непроверенное исключение было перехвачено и было обработано в блоке catch
.
Можно catch
исключить непроверенное, а затем throw
новое проверенное исключение, поэтому любые методы, вызывающие этот метод, где может произойти непроверенное исключение, заставляют метод, вызывающий его, обрабатывать какое-то исключение.
Например, NumberFormatException
, который может быть выброшен при обработке некоторого непонятного String
в методе Integer.parseInt
, является непроверенным исключением, поэтому его не нужно перехватывать. Однако метод, вызывающий этот метод, может захотеть, чтобы его вызывающая сторона должным образом обработала такую проблему, поэтому он может вызвать другое исключение, которое проверено (не подкласс RuntimeException
.):
public int getIntegerFromInput(String s) throws BadInputException {
int i = 0;
try {
i = Integer.parseInt(s);
catch (NumberFormatException e) {
throw new BadInputException();
}
return i;
}
В приведенном выше примере NumberFormatException
перехватывается в блоке try
- catch
, и выдается новый BadInputException
(который должен быть проверенным исключением).
Любой вызывающий метод getIntegerFromInput
будет вынужден поймать BadInputException
и вынужден иметь дело с неверными данными. Если бы NumberFormatException
не должен был быть перехвачен и обработан, любой вызывающий этот метод должен был бы правильно обработать исключение.
(Кроме того, следует отметить, что употребление исключения и выполнение чего-то, что на самом деле не имеет смысла, не считается хорошей практикой - обрабатывайте исключения, когда можно выполнить значимую обработку исключений.)
Из учебников по Java: