Независимо от того, проверено ли исключение или нет, оно полностью зависит от того, какое это исключение: если оно является RuntimeException
или его подклассом, оно не проверяется; в противном случае это так. (И да, RuntimeException
- это подкласс Exception
- одна из ошибок проектирования библиотеки Java, но не самая главная.)
То, что проверяет компилятор, это сигнатуры методов. Таким образом, выбрасываемое исключение не имеет значения (для этой цели). Если методы говорят throws Exception
, то вы должны перехватить Exception
в своем методе или объявить, что метод throws Exception
. Методы всегда должны использовать максимально узкое throws
предложение & mdash; например, не throws Exception
, а throws ParseException
.
(я говорю «не имеет значения (для этой цели)», потому что, конечно, одна из других вещей, которые будет делать компилятор, это проверка того, что вы не выбрасываете проверенные исключения, которые не покрываются ваше throws
предложение.)
Редактировать Код, добавленный в редакторе, не будет компилироваться: 1. Он вызывает метод экземпляра без экземпляра, и 2. main
необходимо объявить, что он выдает Exception
.
Этот код решает другие проблемы и (правильно) демонстрирует, что main
нуждается в предложении throws Exception
:
public class CheckTest
{
public static final void main(String[] params)
{
new CheckTest().method2();
}
public void method1() throws Exception{
throw new java.text.ParseException("foo", 2);
}
public void method2() throws Exception{
this.method1();
}
}
Результат:
CheckTest.java:27: unreported exception java.lang.Exception; must be caught or declared to be thrown
new CheckTest().method2();
^
1 error