聲明拋出異常 和此異常的子類的方法是有意義的,例如 IOException and FileNotFoundException?聲明拋出此異常的異常和子類的方法
我想它是用來以不同的方式處理這兩個異常的調用方法。 但是,如果該方法只拋出最普通,即IOException?
聲明拋出異常 和此異常的子類的方法是有意義的,例如 IOException and FileNotFoundException?聲明拋出此異常的異常和子類的方法
我想它是用來以不同的方式處理這兩個異常的調用方法。 但是,如果該方法只拋出最普通,即IOException?
但是,如果方法拋出最通用的IO異常,是否可以處理這兩種異常?
絕對。您仍然可以抓分別他們:
try {
methodThrowingIOException();
} catch (FileNotFoundException e) {
doSomething();
} catch (IOException e) {
doSomethingElse();
}
因此,它是什麼呼叫者可以做,如果方法聲明既沒有區別 - 它是多餘的。但是,它可以強調您可能要考慮的例外。這可以在Javadoc中勝過拋出聲明。
但是,如果方法拋出的只是最通用的,即> IOException,是否可以處理這兩種異常?
catch(IOException ex){
if(ex instanceof FileNotFoundException){}
}
但這並不看起來很乾淨,既拋出異常看起來不錯,甚至來電者會來知道,這種方法可以把這些這些異常,所以他們會處理得當
是的,如果該方法只拋出IOException,則可以處理兩者。
回答這樣一個問題的最好方法是編寫一個測試來演示並試用它。讓JVM告訴你答案。它會比在這裏要求更快。
實際上,這些回覆比我編寫測試課程的速度快得多。我的問題也有另一部分,我希望它也可能對其他人有用。 –
是的。當某些特殊的異常可以被正確處理時。這是,如果你處理異常如下:
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...
}
它是有意義的申報方法拋出異常,這個異常的子類,例如IOException和FileNotFoundException?
通常不是 - 我知道的大多數IDE甚至會針對這些聲明發出警告。你可以並且應該做的是記錄在Javadoc中拋出的不同異常。
但是,如果該方法只引發最通用的IOException異常,是否可以處理這兩種異常?
是的,你只需要確保catch塊的順序是正確的,即更具體的第一個。catch塊在它們被定義的順序評估,所以這裏
try {
...
} catch (FileNotFoundException e) {
...
} catch (IOException e) {
...
}
如果引發的異常是FileNotFoundException
,它將由所述第一catch
塊被捕獲,否則會掉落到第二和處理作爲一般IOException
。相反的順序將不起作用,因爲catch (IOException e)
會捕獲所有IOException
,包括FileNotFoundException
。 (事實上,後者會導致編譯錯誤IIRC)
聲明,該方法可能會拋出(更多通用)IOException
,以及(更具體)FileNotFoundException
通常是一件好事 - 這是一個稍後使用您的代碼的人的附加信息。請注意,您應該在JavaDoc中明確聲明每種拋出的異常情況。
他們仍然能夠區分異常,使用catch構造這樣一個不同的方式處理它們:
try {
yourAwesomeMethod()
} catch (FileNotFoundException ex) {
// handle file-not-found error
} catch (IOException ex) {
// handle other IO errors
}
沒錯它不是乾淨的 - 但它是沒有必要的,無論是。看到我的答案和Karthik's。基本上沒有必要有這個醜陋。 –
@Jon如果我們聲明拋出IOException的方法,調用者怎麼會知道它也會引發FileNotFoundException? –
它不是「也」 - FileNotFoundException *是一個IOException,因此如果該方法聲明它拋出IOException,那麼您總是可以嘗試捕獲它。應該由文件來指定在什麼情況下發生。 –