Компилятор Java кажется непоследовательным, если есть какой-то код, который явно не может генерировать исключение, и вы пишете окружающий код, который объявляет, что код может генерировать это исключение.
Обратите внимание на эти фрагменты кода.
Фрагмент 1
catch
исключения, которое никогда не генерируется.
public void g(){
try {
} catch (FileNotFoundException e) {//any checked exception
}
}
Это ошибка компиляции с сообщением
Unreachable catch block for FileNotFoundException. This exception is never thrown from the try statement body
Snippet2
Объявление throws
, указывающее на исключение, которое никогда не генерируется.
public void g() throws FileNotFoundException{
}
Компилируется нормально.
Следовательно, результаты первого фрагмента кода показывают, что компилятор может вычислить, может ли метод вызвать исключение, указанное в списке throws
. Таким образом, похоже, что компилятор намеренно не сообщает об ошибке для второго фрагмента. Но почему? Почему компилятор позволяет вам записывать исключения в разделе throws
, даже если он знает, что эти исключения не могут быть сгенерированы?
public class UnreachableCatchBlock { public static void main(String[] args) { UnreachableCatchBlock ucb = new UnreachableCatchBlock(); System.out.println(ucb.getClass().getName() + " started."); ucb.method2(); // ucb.method1(); } private void method1() { try { System.out.println(getClass().getName() + ".method1() started."); } catch (FileNotFoundException e) {//any checked exception } } private void method2() { System.out.println(getClass().getName() + ".method2() started."); } }
компилируется и запускается. - person Germann Arlington   schedule 24.03.2014