2014-03-03 73 views
2

我寫了一個API我應該在throws子句中拋出Exception的子類型嗎?

void doSomething(args) throws Exception1, Exception2; 

Exception1是Exception2的亞型。

Intellij的想法是說「拋出列表中有一個更一般的例外」。我知道Java只要求我在throws子句中有Exception2,但是我認爲我應該在throws子句中有兩個用於文檔的目的,並且向調用者指出他們可以分別捕獲每一個,併爲每一個做不同的事情。在我的API實現中,我拋出了Exception1,並且還調用了拋出Exception2的內部方法。

建議的做法是什麼?

謝謝。

+1

我可以問爲什麼一個例外從另一個例外延伸? – xp500

+0

我明白,買我不明白爲什麼你需要有一個異常的層次結構,而不是兩個擴展'異常' – xp500

+0

你的方法實際上是否拋出兩個異常? –

回答

6

你應該寫一個javadoc,解釋每個特定的異常被拋出的條件。例如,看看ReadableByteChannel.read() javadoc - 該方法在其throws子句中僅聲明IOException,但在其javadoc中描述了該異常的更多特定子類。

5

只需在throws條款中寫throws Exception2即可。來電者仍然可以單獨接收每個人,只要他們在catch (Exception2 e)之前放置catch (Exception1 e)即可。

例如,FileNotFoundExceptionIOException一個亞型,它是有效的寫

try { 
    doSomeStuff(); 
} catch (FileNotFoundException e) { 
    System.out.println("There's no such file"); 
} catch (IOException e) { 
    System.out.println("Your IO doesn't work"); 
} 

即使doSomeStuff()只宣佈投擲IOException。但是你不能以相反的方式去做。在子類的子類之前放置超類的catch子句是無效的。

0

Catch可以比名義上拋出的更具體,所以沒有必要明確地說如果一個擴展另一個就拋出兩個。這樣做也沒有損害。有可能造成一個擴展另一個可能造成的傷害...

相關問題