2011-09-27 44 views
1

我瞭解到調用函數必須聲明或處理被調用的函數聲明拋出的所有異常。但下面的代碼可以編譯。Java:調用函數如何不處理來自子函數的異常?

public a() throws SipException, NullPointerException { 
    try { } 
    catch (SipException e) { throw e; } 
    catch (Exception e) { throw new SipException("...", e); } 
} 
public b() throws SipException { a(); } 

因爲宣告拋出NullPointerException,雖然它並沒有真正做到,怎麼能b忽略這個好嗎?

回答

4

Java區分必須聲明或捕獲的異常或不需要的異常。後者被稱爲未經檢查的例外。

NullPointerException異常是一個非強制異常,它不需要聲明或捕獲(所以你應該從你的throws行刪除

想想看,空指針可以在你的代碼幾乎在任何地方發生。如果你不得不宣佈或趕上他們,每一個方法,就必須做到這一點。

或者作爲this

這是錯誤類別那些未經檢查的異常類(錯誤 及其子類)免於編譯時檢查,因爲 它們可能發生在程序中的許多點處,並且從它們中恢復的是 難以或不可能。宣佈這種例外的計劃將是毫無意義地凌亂, 。

2

調用函數必須聲明或處理被調用函數聲明拋出的所有異常。

這裏的例外是RuntimeExceptions,你不需要聲明。 NullPointerException是一個RuntimeException。 Non-RuntimeException被稱爲「檢查異常」(因爲編譯器檢查你是否考慮過它們)。

1

有兩種主要的異常:RuntimeException和普通的普通老Exception。你只需要明確地處理異常。 RuntimeExceptions可能會被忽略,並且會像在每個簽名中寫入「throws NullPointerException」一樣傳播堆棧。

關於何時使用每種類型有各種各樣的哲學。我訂閱RuntimeExceptions應該表示編碼錯誤的想法,而檢查異常表示在正常運行的程序流中出現「預期」的問題。

+0

+1編程錯誤與正常錯誤 –

+0

不幸的是,許多庫並不遵循這種方法,並針對由瞬態故障條件,配置錯誤或無效輸入等事件導致的各種錯誤拋出RuntimeExceptions。 – Thilo

1

在Java中,有兩種類型的異常不需要明確抓:

  1. 延伸java.lang.Error
  2. 延伸java.lang.RuntimeException

這兩個例外任何異常任何異常存在以表示致命錯誤的例外。不能從中恢復的錯誤不應該首先發生,程序員應該讓程序失敗。所以這種語言可以讓你在這些情況下省略煩人的try {} catch {}樣板。

相關問題