Java捕获异常和子类

时间:2011-07-15 13:00:06

标签: java exception exception-handling try-catch throw

您好,

在Java中,如果像BufferedReader.read()这样的方法说它可以抛出IOException而我试图在两个catch块中捕获FileNotFoundExceptionIOException,那么catch块是什么如果文件不存在,将被输入?

它是仅输入最具体的还是两者兼而有之?

4 个答案:

答案 0 :(得分: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块处理

答案 1 :(得分: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因为所有FileNotFoundException也是IOException s。

答案 2 :(得分:1)

第一个适合该类型的例外(仅限于此)。因此,如果您按照列出的顺序catch上述两种例外类型,则会捕获FileNotFoundException

答案 3 :(得分:0)

首先捕获特定异常。如果特定的一般异常被捕获,则编译时错误。