Почему 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 Rader
static 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

Ответы на вопрос(3)

Ваш ответ на вопрос