2011-07-15 43 views
2

你好,Java的捕捉異常和subclases

在Java中,如果像BufferedReader.read()的方法說,它可以拋出一個IOException,我試圖抓住一個FileNotFoundException,並在兩個catch塊的IOException,什麼catch塊會如果進入文件不存在?

它只輸入最具體還是兩者?

回答

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 
} 

編譯消息稱:

不可達抓爲FileNo塊tFoundException。 IOException異常已被catch catch塊處理

+0

第一個代碼庫是一個編譯器錯誤。是不是? – Azodious

+0

@Abodious糟糕 - 是的。這是一個編譯器錯誤。謝謝,我會在答案中註明 – Bohemian

1

第一個適用於這種類型的異常(並且只有那個)。因此,如果您按照您列出的順序排列上述兩種異常類型catch,則會捕獲FileNotFoundException

2

只有遇到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秒。

0

特定異常首先被捕獲。如果通用異常被捕獲,那麼這是一個編譯時錯誤。