2009-10-01 69 views
42

作爲一名希望完善他的編程技能的java程序員,我經常遇到必須創建運行時異常的情況。我知道如果明智地使用這是一個很好的做法。java中最常用的運行時異常是什麼?

個人,NullPointerException異常IllegalStateException異常是在我創建了軟件最常用的。你呢?

你經常使用哪些運行時異常?你在什麼情況下使用它們?

回答

66

我從不拋棄空指針異常。對我而言,當出現問題時,它是自然出現在代碼中的,並且需要開發人員看看會發生什麼。然後(他)修復了原因,並且不再發生。

我使用IllegalStateException表示對象配置不正確或調用順序不正確。但是,我們都知道理想情況下,對象應確保它不能處於不良狀態,並且不能以錯誤的順序調用它(使構建器和生成的對象......)。

我使用了很多IllegalArgumentException當一個方法檢測到它的參數不正確。這是任何公共方法的責任,要停止處理(以避免更難理解的間接錯誤)。此外,在方法開始時的幾個if用於文檔目的(文檔從未與代碼分離,因爲它是代碼:-))。

 public void myMethod(String message, Long id) { 
     if (message == null) { 
      throw new IllegalArgumentException("myMethod's message can't be null"); 
      // The message doesn't log the argument because we know its value, it is null. 
     } 
     if (id == null) { 
      throw new IllegalArgumentException("myMethod's id can't be null"); 
      // This case is separated from the previous one for two reasons : 
      // 1. to output a precise message 
      // 2. to document clearly in the code the requirements 
     } 
     if (message.length()<12) { 
      throw new IllegalArgumentException("myMethod's message is too small, was '" + message + "'"); 
      // here, we need to output the message itself, 
      // because it is a useful debug information. 
     } 
    } 

我也用具體運行時例外信號更高級別的得天獨厚的條件。

例如,如果我的應用程序的模塊無法啓動,我可能有一個ModuleNotOperationalException拋出(最好通過類似攔截器的通用代碼,否則由特定代碼)時,另一個模塊調用它。在那個架構決定之後,每個模塊必須處理調用其他模塊的操作的這個異常...

+1

大點的男人! – 2009-10-01 09:45:00

+8

偉大的名單;我會添加UnsupportedOperationException,我一直在使用集合接口的特定實現。 – Carl 2009-10-01 11:30:24

+0

很棒的回答。我將來會更加關注IllegalStateException! – reef 2009-10-01 12:09:19

3

我使用IllegalArgumentException相對經常。大多數情況下,我會盡量在邏輯上儘快返回默認值,但有些時候不是這樣,所以我使用這個。

我使用的另一個是ArrayIndexOutOfBoundsException

11

我一直認爲,運行時異常應該代表編程錯誤(例如null參考在出乎意料的時候過去了,數組索引出界,等等),而檢查的異常應該代表了環境,不能「編碼得天獨厚的條件離開「(例如IOException,SQLException)。

違反此規則的是,有時您需要在RuntimeException中包裝應該檢查的異常,以滿足接口的定義。作爲一個簡單的例子,您可能會有一些時髦的實現java.util.List來管理多臺機器之間的分佈式列表。很顯然,如果定義它自己,這將拋出檢查異常(可能是IOException的某個子類),但是使這個類實現List的好處是客戶端可以在任何他們使用另一個列表的地方以幾乎透明的方式使用它。

雖然這可能會導致Joel所說的leaky abstraction,所以重要的是您的文檔清楚說明可以拋出什麼異常以及它們是什麼意思!在這種情況下,我發現RuntimeException的自定義子類在傳達根本原因時通常會更清楚,而不是試圖將其用於現有的運行時異常類。

+0

您符合Java的原始思想,涉及CheckedExceptions。實際上,這被稱爲Java的唯一原始特徵(所有其他語言都來自成功的其他語言)。但是這個問題引發了很多爭論,我認爲目前的趨勢是將這種區分視爲Java中的一個錯誤。確切的問題將在這裏脫離主題,你可以谷歌他們... – KLE 2009-10-01 09:50:13

2

UnknownException,非常有用的:P

我也很喜歡org.apache.commons.lang.NotImplementedException

+13

我使用拋出新的UnsupportedOperationException(「尚未實現」);'我的應用程序的部分尚未實現。 – Jesper 2009-10-01 12:51:15

2

主要是我不扔運行時異常。而不是在檢查特定條件後拋出用戶定義的異常。但是我使用的幾個是--IllegalAccessException,ArithmeticException,NumberFormatException和SecurityException - 。

0

根據約書亞布洛赫有效的Java

最常用重用例外:

  1. 拋出:IllegalArgumentException
  2. IllegalStateException異常
  3. NullPointerException異常
  4. IndexOutOfBoundsException異常
  5. ConcurrentModificationException的
  6. UnsupportedOperationException異常