Java перехватывает исключения и подклассы - PullRequest
2 голосов
/ 15 июля 2011

Здравствуйте,

Если в Java такой метод, как BufferedReader.read(), говорит, что может выдать IOException, а я пытаюсь поймать FileNotFoundException и IOException в двух блоках перехвата, то какие перехватчикибудет введен, если файл не существует?

Он вводит только самые конкретные или оба?

Ответы [ 4 ]

6 голосов
/ 15 июля 2011

Будет введен первый кодированный улов, который соответствует исключению.
Отредактировано для включения комментария от Азодиуса

Например:

try {
   bufferedReader.read();
} catch (FileNotFoundException e) {
   // FileNotFoundException handled here
} catch (IOException e) {
   // Other IOExceptions handled here
}

Этот следующий код не компилируется:

try {
   bufferedReader.read();
} catch (IOException e) {
   // All IOExceptions (and of course subclasses of IOException) handled here
} catch (FileNotFoundException e) {
   // Would never enter this block, because FileNotFoundException is a IOException
}

Сообщение компилятора гласит:

Недоступный блок catch для исключения FileNotFoundException. Он уже обрабатывается блоком catch для IOException

2 голосов
/ 15 июля 2011

Будет запущен только первый обнаруженный блок перехвата, в котором тип исключения блока перехвата совпадает с типом создаваемого исключения (более конкретно, первый блок перехвата, где будет выполняться (e instaceof <exception type>)==true) Ни один из других блоков захвата не будет запущен.

Например

try{
    BufferedReader.read();
}
catch(FileNotFoundException e){System.out.println("FileNotFoundException");}
catch(IOException e){System.out.println("IOException");}

Напечатает FileNotFoundException, если BufferedReader.read() выбросит FileNotFoundException.

Обратите внимание, что на самом деле следующее не компилируется:

try{
    BufferedReader.read();
}
catch(IOException e){System.out.println("IOException");}
catch(FileNotFoundException e){System.out.println("FileNotFoundException");}

потому что Java понимает, что невозможно FileNotFoundException быть пойманным, потому что все FileNotFoundException s также IOException s.

1 голос
/ 15 июля 2011

Первый, который подходит для этого типа исключения (и только для этого).Так что, если вы catch два вышеупомянутых типа исключений в порядке их перечисления, FileNotFoundException будет пойман.

0 голосов
/ 15 июля 2011

Определенное исключение ловится первым. и это ошибка времени компиляции, если генерируется исключение общего характера перед конкретным.

...