2

你好,

在Java中,如果像这样的方法BufferedReader.read()说它可以抛出一个IOException并且我尝试在两个catch块中捕获aFileNotFoundException和an IOException,如果文件不存在,将输入什么catch块?

它是只输入最具体的还是两者都输入?

4

4 回答 4

6

将输入与异常匹配的第一个编码捕获。
编辑以纳入 Azodius 的评论

例如:

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
}

编译器消息说:

FileNotFoundException 的无法到达的 catch 块。它已经由 IOException 的 catch 块处理

于 2011-07-15T13:02:22.763 回答
2

只有遇到的第一个 catch 块的异常类型与被抛出的异常类型匹配时才会运行(更具体地说,第一个运行的 catch 块(e instaceof <exception type>)==true)。不会运行任何其他 catch 块。

例如

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被捕获,因为所有FileNotFoundExceptions也是IOExceptions。

于 2011-07-15T13:04:05.600 回答
1

第一个适用于该类型的异常(并且仅适用于该异常)。因此,如果您catch按照列出它们的顺序将上面的两种异常类型,aFileNotFoundException将被捕获。

于 2011-07-15T13:01:47.720 回答
0

首先捕获特定异常。如果在特定异常之前捕获到通用异常,则这是编译时错误。

于 2011-07-15T13:07:38.713 回答