2012-04-17 134 views
4

有人可以解釋我在java中拋出異常的用法是什麼? 它只是用來表示該方法將拋出指定的異常?調用方法需要捕獲指定的異常?什麼是拋出異常

因此,而不是拋出,我們可以使用try-catch塊來捕獲異常?

它與throw有何不同? 感謝

+3

請閱讀[上異常的Java教程](http://docs.oracle.com/javase/tutorial/essential/exceptions/)。 – assylias 2012-04-17 08:31:08

+0

除非你要做一些有用的事情,否則你不應該捕獲異常。只是印刷它,假裝它沒有發生或忽略它通常是一個壞主意。通常將它傳遞給調用者是最好的應用。 eveen for'main(String [])'你可以有'拋出Exception' – 2012-04-17 08:32:24

回答

10

Java使用明確的異常處理 - 除的RuntimeException S,每個異常拋出[由該方法本身,或者調用方法聲明它throws吧] - 必須處理或方法簽名中聲明。

它允許安全性,因爲當你調用你確切地知道可能發生的錯誤的方法,然後你就可以在本地與try/catch塊處理,或聲明爲方法簽名的一部分。

+3

+1「你確切地知道哪些運行時錯誤可能發生」。是的,但不幸的措辭,因爲RuntimeExceptions和錯誤只是不需要聲明。 (雖然沒有更好的術語,儘管如此)。 – Thilo 2012-04-17 08:28:58

+0

好的,謝謝,所以它是一種表明這種異常可能發生的調用方法? – mee 2012-04-17 08:30:21

+0

@Thilo:是的,我也注意到了這一點,這就是爲什麼我記得在答案的第一句中指出RuntimeException問題的原因。我會很高興編輯,如果建議更好的術語:) – amit 2012-04-17 08:30:22

0

throws關鍵字指示該方法可能拋出異常。
當你認爲調用者想要做他自己的異常處理時,你應該使用它,否則你應該使用try-catch塊並且在catch塊中返回一個指定的錯誤值,如indexOf()(來自Array)返回-1而不是拋出異常。

0

簡而言之,如果您對特定異常使用try-catch塊,那麼您正在處理異常。 如果您在方法上指定了throws,那麼您聲明該方法可以拋出這樣的異常(並且不在其內部處理它),並且它成爲調用者處理該異常的責任。

+0

好吧,我明白了......謝謝! – mee 2012-04-17 08:39:50

0

如果添加throws一種方法,它意味着這個方法可以拋出Exception來調用它的方法。

例如:

public void method1() throws Exception { 
    ... 
    throw new Exception(); 
    ... 
} 

public void method2() { 
    try { 
     method1(); 
    catch(Exception e) { 
     ... 
    } 
} 

如果你不告訴的方法來throwException你必須使用trycatch來處理它。

有關異常處理的詳細信息,請參閱文檔: http://docs.oracle.com/javase/tutorial/essential/exceptions/

5

雖然@amit已經給了很好的答案,我只想補充一些東西。

因此,而不是拋出,我們可以使用try-catch塊來捕獲異常?

我認爲你的問題的這部分沒有回答。實際上,你問的是你是否應該定義對異常「透明」的方法或捕獲方法中拋出的異常。

答案是它取決於您的應用程序。 通常有2種情況,當你想要捕捉例外的方法。

  1. 你與異常有關,所以你的流程取決於拋出異常的事實。例如,如果您正在從文件讀取併發生IO錯誤,則您正嘗試再次從文件讀取。
  2. 您不想將應用程序的特定層上拋出的異常暴露給更高層次的層。在這種情況下,你可能會用try塊包裝你的代碼和包裝拋出的異常與其他級別的異常:

    嘗試{// 一些代碼 }趕上(IOException異常E){ 拋出新ApplicationLevelException(E); }

在你可能會想是透明的例外和捕獲所有異常在知道與他們做一個單點其他大多數情況下。例如顯示面向客戶的錯誤消息。

0

雖然已經給出了正確的答案,但我想補充一點,每當使用try-catch塊時,都會創建一個新線程來處理異常。當主線程和try-catch塊線程中執行的活動導致任何衝突時,這有時會導致問題。

因此,最好聲明您的API方法,以拋出throws子句的異常並處理使用您的API的應用程序中的異常。

使用try-catch塊是最後一個選項!;)

相關問題