2012-04-22 27 views
0

我認爲這是一個簡單而重要的問題。Java:通過布爾錯誤,空指針或異常傳遞錯誤?

我寫一個類的函數:

public MyClass myFunction(MyClass mc) { ... } 

在這個函數,它改變了MC的一些狀態,然後返回。我知道這是沒有必要的,因爲MC是在變化。我想返回MyClass的原因是使用null來表示失敗的更新。

我可能會改變返回類型爲布爾值,並利用虛假指示錯誤:

public boolean myFunction(MyClass mc) { ... } 

不過,我記得我曾經看過一篇文章相當長的時間以前說這是不是一個好的做法(雖然我忘記了細節和原因)。

我當然可以使用異常來表示錯誤:

public void myFunction(MyClass mc) throws MyException { ... } 

但我得到一個感覺,這是太重加權。

我個人的看法是,如果錯誤是有意義的全系統,然後異常應該被使用。如果錯誤僅對調用者和函數有意義,則不應使用異常。但是在這種情況下,我應該使用null還是false來表示錯誤?

什麼是你認爲最好的做法是什麼?請讓我知道你的意見。

非常感謝。

回答

5

是失敗的更新過程的預期部分?還是隻有當這一切發生災難性錯誤時纔會發生?

如果它是一個真正的特殊條件,那麼你應該更喜歡使用異常。返回值這樣的事情往往會被忽略(只是看一些可怕的布爾返回File功能,如mkdirs

如果失敗是試圖做一個更新的預期部分,那麼你應該返回一個布爾型或某種狀態對象。

+1

的'最大的痛苦File'的設計是當你把幾個這樣的呼叫串在一起,並且哪個失敗時,都沒有意義繼續下去。作者應該真的關心這個問題:它會讓我在需要將'if(!action)throw SomeException'中的每個動作都包裝起來的地方編寫godawful代碼嗎? – 2012-04-22 18:48:54

0

多數民衆贊成通常不贊成代替拋出異常的是使用某種形式的返回碼(int或此類)的做法。如果失敗的更新是「正常」行爲,則返回布爾值就可以了。例如Collection.add可以做到這一點。你上市

0

從三個選項中,我會使用第一個。

public MyClass myFunction(MyClass mc) { ... } 

在這種情況下,myFunctions或者返回它的參數(MC),則返回null - 只有兩個選項可用,所以基本上相同

public boolean myFunction(MyClass mc) { ... } 

正如史蒂芬Schlansker說,你應該決定是否失敗的更新是非常特殊的狀態或應該由用戶處理的事情。

一個額外的一點要注意:如果你決定要實現它的方法返回布爾(未拋出異常),那麼我建議你可以確信沒有變化或所有的變化都做MyClass的MC對象。

例如,如果myFunction應該更新MyClass中的3個字段(x,y,z)。如果調用myFunction的(MC),它是能夠更新他們的兩(X,Y)和更新第三(ž)時失敗,則返回。您的MyClass mc對象然後處於不一致的狀態,因爲x和z已更新,但是z不是。如果用戶決定繼續使用現有的mc對象,則可能會導致更多問題。如果您決定實施myMethod作爲拋出異常的方法,則可能更容易理解該對象可能處於無效狀態。

0

它依賴於調用者函數。

如果調用函數需要一個對象

   then you should return Null in case of failure 
      and return the OBJECT in case of success 

的值。如果調用函數只需對象的狀態是否已更新或不

   then return true in case of success 
      and return false in case of failure