2016-12-17 98 views
0

在Java文檔中,我看到了定義「爲什麼運行時異常是不可恢復的?」

如果一個客戶可以合理預期從異常中恢復,使它成爲一個檢查異常。如果客戶不能做任何事情,從異常中恢復,使它一個未經檢查的異常

Unchecked Exceptions — The Controversy

我並不清楚瞭解這個概念‘從’恢復,這是什麼意思?

而且,基於這個定義,爲什麼NumberFormatException不能恢復?我認爲當發生這種異常時,我們可以要求用戶提供另一個有效的字符串來繼續該程序。那是對的嗎?

+1

Java教程不是 'Java文檔'。您引用的頁面構成反對使* all *例外未被選中的論據。 – EJP

回答

4

如果發生錯誤的顯影劑不能合理恢復從它應該是一個Error例如VerifyErrorNoMuchMethodError。如果發生的情況,我相信應該是不可能的,我用AssertionError

如果發生錯誤,開發人員也許能夠從中恢復,但大多數開發商都不太知道如何處理異常,使用RuntimeException,因爲這沒有按不要強迫開發人員編寫處理代碼。

如果錯誤傳遞給調用者處理,即使大多數開發人員不知道如何從異常中恢復,並且即使他們這樣做了,也可能發現很難從該異常中恢復,但檢查的異常可以使用。

你也可以創建一個Throwable或者一個直接的子類,它也被檢查,但是我只用它作爲打印堆棧跟蹤的簡單方法,即清楚它並不是一個真正的錯誤。我建議避免像Throwable這樣的投擲,因爲它很混亂,不太可能被正確處理。

在我們的代碼庫,我們可以說,我們使用異常有效,在許多情況下都寫在主叫方和被叫方是是能夠通過異常的有用的方式最好機會。從來沒有少,通過後備只佔19%,我們的catch箱子,以及案件的6%「信號」帳戶恢復(「信號」是由深通過檢查異常在罕見的情況下調用棧)

綜上所述,我們只能設法處理和異常/錯誤的約25%,我相信檢查的異常意的方式收回。我認爲這是一個有價值的25%,但如果它更高,我會更高興。

enter image description here

爲充分討論後,我們處理異常的不同方式。 https://vanilla-java.github.io/2016/06/21/Reviewing-Exception-Handling.html

3

「恢復」意味着異常不會停止您的程序,程序可以處理異常(藉助try catch塊),然後繼續執行。

例如:

  • 您正在創建一個程序通過員工數據庫進行搜索。
  • 如果沒有找到某個員工,那麼您的程序預計將從(處理它)中恢復,並允許用戶尋找另一名員工
  • 在這種情況下,你可以創建一個的Checked Exception稱爲EmployeeNotFoundException
  • 檢查異常將促使程序員來處理它(通過try catch或使用throws

即將爲什麼NumberFormatException就是由是一個未選中的項目:

  • 首先,問題中提到的規則適用於用戶定義的異常,而不適用內置的例外。
  • 它是一個未檢查的異常,因爲它們表示編程錯誤
  • 在調用Integer.parseInt()(例如)之前知道輸入字符串是否是有效的整數是可能的。所以你應該在嘗試解析它之前執行這個檢查,而不是把這個責任交給JVM。
  • 您可以嘗試捕獲一段引發未檢查異常的代碼並嘗試處理它,但未檢查異常的發生理想地指示了無法預期處理的問題。
+0

NumberFormatException是編程錯誤,它是正確的,所以它是未經檢查的異常...但是,ParseException,FileNotFoundException不是編程錯誤(因爲它檢查錯誤)?我無法區分它們之間的不同(NumberFormatException和ParseException):( –

+0

@ user7308994如果您可以要求用戶輸入正確的信息,NumberFormatException是一個輸入異常並且可以恢復。 –

+0

現在,讓我來舉個例子:對於NumberFormatException,當發生異常時,我會自動將輸入字符串賦值爲「0」(或「1」,「2」,..)=>,以便恢復操作? –

2

檢查異常的主要原因似乎是要控制何時何地處理錯誤。你可以立即用try-catch來處理它,或者只是聲明方法throws它並將它處理一個(或幾個)級別。這也表明你可以從錯誤中恢復過來 - 爲什麼你會在乎你處理它們的方式?

一個NumberFormatException不是用戶給出錯誤輸入的錯,但因此誰沒有預見的是無效的輸入可以給予,並有可能程序員不可恢復;它本質上是一個錯誤。

下面是一些更深入地閱讀有關異常:Checked vs unchecked exceptions

0

你是正確的,你可以隨時處理異常。 try-catch塊出於同樣的原因。但是處理所有可能導致代碼的異常可能會導致繁瑣的代碼庫。此外,還有更多的情況下,程序員的編碼錯誤導致RuntimeException錯誤,而不是用戶提供的無效輸入。

它終於意味着如果要提供的功能不能做的任何異常並沒有方法來處理它,那麼該異常將被標記爲未檢查異常。如果他想要處理未經檢查的Exception來提供某種功能,那麼它最終取決於程序員。

相關問題