Почему java не обнаруживает недоступный блок catch, если я использую несколько блоков catch?
Исследуйте следующий метод:
static private void foo() {
try {
throw new FileNotFoundException();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Этот код хорошо компилируется, несмотря на то, что последний блок catch фактически недоступен.
Теперь давайте прокомментируемthrow new FileNotFoundException();
строка
выполнить:
Ой! мы видим
Unreachable catch block for FileNotFoundException. This exception is never thrown from the try statement body
Странный. Почему Java использует двойные стандарты для этих ситуаций?
обновление для @Peter Raderstatic private void foo(FileNotFoundException f) {
try {
throw f;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
работать так же, как и с вызовом конструктора
ОбновитьЯ заметил, что в разных версиях Java-компилятора я вижу разные результаты компиляции этого кода.
public class RethowTest {
public static void main(String[] args) {
try {
throw new FileNotFoundException();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
throw e;
}
}
}
на моем локальном компьютере: Java 1.7.0_45 -
C:\Program Files\Java\jdk1.7.0_45\bin>javac D:\DNN-Project\DNN-Project\src\main\java\exceptionsAndAssertions\RethowTest.java
D:\DNN-Project\DNN-Project\src\main\java\exceptionsAndAssertions\RethowTest.java:15: warning: unreachable catch clause
} catch (IOException e) {
^
thrown type FileNotFoundException has already been caught
1 warning
Java 1.6.0_38
D:\DNN-Project\DNN-Project\src\main\java\exceptionsAndAssertions\RethowTest.java:16: unreported exception java.io.IOException; must be caught or declared to be thrown
throw e;
^
1 error
http://www.compileonline.com/compile_java_online.php (Javac 1.7.0_09) -
HelloWorld.java:9: warning: unreachable catch clause
} catch (IOException e) {
^
thrown type FileNotFoundException has already been caught
1 warning