2013-02-19 59 views
3

假設有一個方法:如何在方法中返回錯誤?

MyClass myMethod(MyClass input){ 
    //body of method 
} 

以爲我不知道哪兒可以採用這種方法。如果輸入爲空,那麼如何決定是否應該拋出異常或僅返回空值?

我有同樣的問題,像

void myMethod(MyClass input){ 
    //body of method 
} 

的方法如果輸入爲空,我應該只是返回不執行任何操作或拋出一個異常,或者說System.error()?

我已將所有這些用於我的項目。這一切都很好,因爲我的大部分課程都沒有公開的方法。

+0

這主要是基於輿論的問題,因此可能被關閉。不過,請查閱馬丁的Clean Code,瞭解關於如何處理這些情況的一篇神奇專着(用Java編寫)。 – 2013-08-17 22:11:03

回答

0

一般來說,永遠不要在任何地方允許null。它只會讓生活變得困難。 Java使得很難遵循這個建議,但是你用你所擁有的東西做你所能做的。

1

是空輸入一個例外的情況,還是合理的正常行爲?如果出現異常行爲,請拋出異常。如果預計會發生,請考慮返回null

1

如果輸入爲空,那麼我該如何決定是拋出一個異常還是隻返回一個空值?

問問自己,是null有效的輸入?如果是的話,不要拋出異常並進行邏輯處理。如果不是,拋出異常。

這裏的有效含義是什麼:比方說,你正在一些對象中存儲一些值,其中一些是可選的。即用戶可能會或可能不會提供這些值。在這種情況下,null僅適用於這些字段,但對於必填字段null不可接受。

對你的問題應用類似的思維,你可能會得出結論。

另一個例子:假設你打開一個文件,輸入的方法是filePath。如果給定的路徑爲空,則該路徑無效並拋出異常。

1

如果input爲null將在執行過程中在您的代碼中創建一個錯誤,那麼您應該拋出一個異常(例如IllegalArgumentException)。否則,你可以返回null。

0

如果不希望用null參數調用該方法,那麼可以拋出NullPointerException(簡稱NPE),因爲它是輸入!= null的先決條件,並且調用方應該事先對其進行驗證。

/** My method. 
    * @param input the input, must not be null. 
    */ 
void myMethod(MyClass input){ 
    if (input==null) throw new NullPointerException(); 
    //... 
} 

扔NPE,不增加你的程序分支計數一個常見的成語是:

void myMethod(MyClass input){ 
    input.getClass(); //NPE if input is null 
    //... 
} 

在某些情況下,上述的檢查是在代碼中隱含:

void printLowercase(String input){ 
    System.out.println(input.toLowerCase()); 
} 

避免實現一種失敗的方法,因爲它使得調用者很難知道該方法是否失敗。相反,返回布爾值。

boolean myMethod(MyClass input){  
    if (input==null) { 
     //you may log that the input was null 
     return false; 
    } 
    //... 
    return true; 
} 
-1

這是一個值得商榷的問題。我會說考慮問題域,並選擇最適合使用。

在任何情況下,清楚地記錄您的代碼對於此類輸入的行爲(使用簡潔的Javadoc),以便您的API的用戶不會意外的行爲感到驚訝。

0

答案是

出來,不問

的想法是委託錯誤處理的對象,可以決定是否返回某個值或拋出異常。

如果你有在方法簽名控制比你可以做

MyClass myMethod(MyClass input, Expectation whenInputIsNull){ 
    if(input==null) { 
     // might also throw 
     return whenInputIsNull.handle(); 
    } 
    //body of method 
} 

如果你沒有在方法簽名控制,可能比你放置Expectation在所屬的類中的一員myMethod

這可能是非常好的閱讀:

foo.myMethod(input, Expect.nullReturned()); 
foo.myMethod(input, Expect.throwIllegalArgumentException()); 

我覺得很方便的時候,這是與倉庫使用:

fooRepository.findByBar(bar, Expect.atLeast(5));