2012-06-20 110 views
6

聲明拋出異常 和此異常的子類的方法是有意義的,例如 IOException and FileNotFoundException聲明拋出此異常的異常和子類的方法

我想它是用來以不同的方式處理這兩個異常的調用方法。 但是,如果該方法只拋出最普通,即IOException

回答

7

但是,如果方法拋出最通用的IO異常,是否可以處理這兩種異常?

絕對。您仍然可以抓分別他們:

try { 
    methodThrowingIOException(); 
} catch (FileNotFoundException e) { 
    doSomething(); 
} catch (IOException e) { 
    doSomethingElse(); 
} 

因此,它是什麼呼叫者可以做,如果方法聲明既沒有區別 - 它是多餘的。但是,它可以強調您可能要考慮的例外。這可以在Javadoc中勝過拋出聲明。

0

但是,如果方法拋出的只是最通用的,即> IOException,是否可以處理這兩種異常?

catch(IOException ex){ 
if(ex instanceof FileNotFoundException){} 
} 

但這並不看起來很乾淨,既拋出異常看起來不錯,甚至來電者會來知道,這種方法可以把這些這些異常,所以他們會處理得當

+0

沒錯它不是乾淨的 - 但它是沒有必要的,無論是。看到我的答案和Karthik's。基本上沒有必要有這個醜陋。 –

+0

@Jon如果我們聲明拋出IOException的方法,調用者怎麼會知道它也會引發FileNotFoundException? –

+0

它不是「也」 - FileNotFoundException *是一個IOException,因此如果該方法聲明它拋出IOException,那麼您總是可以嘗試捕獲它。應該由文件來指定在什麼情況下發生。 –

0

是的,如果該方法只拋出IOException,則可以處理兩者。

回答這樣一個問題的最好方法是編寫一個測試來演示並試用它。讓JVM告訴你答案。它會比在這裏要求更快。

+0

實際上,這些回覆比我編寫測試課程的速度快得多。我的問題也有另一部分,我希望它也可能對其他人有用。 –

0

是的。當某些特殊的異常可以被正確處理時。這是,如果你處理異常如下:

try { 
} catch (FileNotFoundException f) { 
//Try a different file 
} catch (IOException ioe) { 
//Fatal, Maybe bad blocks ... Bail out... 
} catch (Exception e) { 
//Something went wrong, see what it is... 
} 
3

它是有意義的申報方法拋出異常,這個異常的子類,例如IOException和FileNotFoundException?

通常不是 - 我知道的大多數IDE甚至會針對這些聲明發出警告。你可以並且應該做的是記錄在Javadoc中拋出的不同異常。

但是,如果該方法只引發最通用的IOException異常,是否可以處理這兩種異常?

是的,你只需要確保catch塊的順序是正確的,即更具體的第一個。catch塊在它們被定義的順序評估,所以這裏

try { 
    ... 
} catch (FileNotFoundException e) { 
    ... 
} catch (IOException e) { 
    ... 
} 

如果引發的異常是FileNotFoundException,它將由所述第一catch塊被捕獲,否則會掉落到第二和處理作爲一般IOException。相反的順序將不起作用,因爲catch (IOException e)會捕獲所有IOException,包括FileNotFoundException。 (事實上​​,後者會導致編譯錯誤IIRC)

0

聲明,該方法可能會拋出(更多通用IOException,以及(更具體FileNotFoundException通常是一件好事 - 這是一個稍後使用您的代碼的人的附加信息。請注意,您應該在JavaDoc中明確聲明每種拋出的異常情況。

他們仍然能夠區分異常,使用catch構造這樣一個不同的方式處理它們:

try { 
    yourAwesomeMethod() 
} catch (FileNotFoundException ex) { 
    // handle file-not-found error 
} catch (IOException ex) { 
    // handle other IO errors 
}