你好,
在Java中,如果像这样的方法BufferedReader.read()
说它可以抛出一个IOException
并且我尝试在两个catch块中捕获aFileNotFoundException
和an IOException
,如果文件不存在,将输入什么catch块?
它是只输入最具体的还是两者都输入?
你好,
在Java中,如果像这样的方法BufferedReader.read()
说它可以抛出一个IOException
并且我尝试在两个catch块中捕获aFileNotFoundException
和an IOException
,如果文件不存在,将输入什么catch块?
它是只输入最具体的还是两者都输入?
将输入与异常匹配的第一个编码捕获。
编辑以纳入 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 块处理
只有遇到的第一个 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
s也是IOException
s。
第一个适用于该类型的异常(并且仅适用于该异常)。因此,如果您catch
按照列出它们的顺序将上面的两种异常类型,aFileNotFoundException
将被捕获。
首先捕获特定异常。如果在特定异常之前捕获到通用异常,则这是编译时错误。