在Java中,如果像BufferedReader.read()
的方法說,它可以拋出一個IOException
,我試圖抓住一個FileNotFoundException
,並在兩個catch塊的IOException
,什麼catch塊會如果進入文件不存在?
它只輸入最具體還是兩者?
在Java中,如果像BufferedReader.read()
的方法說,它可以拋出一個IOException
,我試圖抓住一個FileNotFoundException
,並在兩個catch塊的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
}
編譯消息稱:
不可達抓爲FileNo塊tFoundException。 IOException異常已被catch catch塊處理
第一個適用於這種類型的異常(並且只有那個)。因此,如果您按照您列出的順序排列上述兩種異常類型catch
,則會捕獲FileNotFoundException
。
只有遇到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
秒。
特定異常首先被捕獲。如果通用異常被捕獲,那麼這是一個編譯時錯誤。
第一個代碼庫是一個編譯器錯誤。是不是? – Azodious
@Abodious糟糕 - 是的。這是一個編譯器錯誤。謝謝,我會在答案中註明 – Bohemian