回答
這取決於你的用例。
如果您希望API的用戶處理無效,因爲您的API沒有指定應如何處理無效性,請拋出異常。
你也可以檢查null,然後拋出一個IllegalArgumentException異常,並給出解釋爲什麼不允許null的消息,或者可能的值。但是,如果要在實現中處理空值,則必須清楚地說明該方法如何處理空條件。
例如,看看StringUtils或EnumUtils如何在Apache commons-lang中處理無效。
異常處理的另一個有趣的閱讀是here。
可能的使用情況:
檢查空,默認爲缺省值:這應該在方法的規範進行記錄。
if(value == null) { value = DEFAULT_VALUE; }
這是首選當API需要徵收默認行爲。缺點是,缺省行爲不容易被API的用戶改變。
檢查空和投擲檢查異常主要是爲了迫使API的用戶來處理無效的情況:
if(value == null) { throw new MyCheckedException("Value cannot be null"); }
API的用戶需要辦理或者重新擲它:
try {
MyObject value = doWork();
} catch (MyCheckedException e) {
handleException(e);
}
此方法允許API的用戶更好地控制異常處理。
以上兩種方法都是安全的。
但是,如果您希望系統在遇到空值時僅在運行時發生故障,並且不強制API的用戶處理該異常,則可能會用運行時異常包裝它。
檢查空和投擲運行時異常:
if(value == null) throw new MyRuntimeException("Value is null");
在任何情況下,你會留下空條件選中。
這非常依賴於您的上下文。我只能評論說JDK API經常選擇拋出異常,這會在方法調用之前強制添加樣板檢查。特別會傷害的是方法的可組合性,其中您希望null
值能夠無縫地通過鏈接調用傳播,並且只能在最後被檢測到,而不是在每個特定步驟進行艱苦檢查,這需要大量的開銷局部變量保持中間結果的方式,if-branching等等。
因此,以上述爲準則來指導您的選擇。
如果只有開發者的情況應該知道它的一個bug。
assert value != null;
如果它的情況值不必爲空。
if (value == null) throw new NullPointerException();
如果它的情況值真不應該爲空。
if (value == null) LOGGER.error("Null value!", new NullPointerException());
如果它的情況值可能不應該爲空。
if (value == null) LOGGER.warn("Null value.");
如果它的情況值非常空。
if (value == null) LOGGER.info('Value is null.');
任何其他情況:
它的設計問題,你可以從過載到void foo(Object maynull)
的void foo()
方法?也許一個類中的字段通常可以爲null,將其重新設計爲Object和Wrapper類。
在示例(假設你沒有懶惰干將):
public class Car{
Passengers[] p; // Bad idea
Passengers[] p=new Passengers[0]; // Good idea
List<Passengers> p; // Bad idea
List<Passengers> p=new ArrayList<>(); // Good idea
}
或所述實施例:
// Bad idea
public class Tree{
Bird motacillaFlava=null;
...
}
// Good idea
public class Tree{...}
public class BirdInTree{Tree t; Bird motacillaFlava;}
問候。
注意:斷言只適用於-ea
標誌
- 1. 魔術異常拋出拋出異常
- 2. 拋出異常拋出異常
- 3. 異常拋出異常
- 4. 空或拋出異常
- 5. WCF - 拋出異常或FaultException?
- 6. 拋出異常
- 7. 異常拋出
- 8. 拋出異常
- 9. 拋出異常
- 10. 拋出異常
- 11. 拋出異常
- 12. 拋出異常
- 13. 拋出異常
- 14. 拋出或重新拋出異常?
- 15. NamedParameterJdbcTemplate對象拋出異常
- 16. 拋出異常對象
- 17. javascript對象拋出異常
- 18. 對拋出的異常
- 19. 對拋出的異常
- 20. 對象類拋出類拋出異常
- 21. 拋出異常不拋出
- 22. 等待()上的Servlet拋出異常
- 23. RESTClient實現拋出異常異常
- 24. 無效的異常拋出異常
- 25. PDFBox拋出異常:空引用異常
- 26. 在C++中拋出異常異常
- 27. Groovy結束異常拋出異常
- 28. Ognl異常類拋出異常
- 29. 拋出異常並捕獲異常?
- 30. LLVM異常拋出
_ 「在你看來」 _。這只是爲了獲得接近的選票。也許重新格式化這個問題。它看起來並不像是一個有見識的問題。 –
如果你不得不問,你應該拋出異常。不得不提問意味着你不知道在你的方法背景下做的正確事情。 –