0

假設我們有一個服務方法getById(Long id),它根據它的id返回一個實體。在id爲null的情況下應該採取的適當措施是什麼?服務層:如果查詢參數爲null,返回什麼?

拋出IllegalArgumentException?

拋出NullPointerException? (番石榴Preconditions.checkNotNull這樣做)

return null?

因爲永遠不會有一個id == null的實體,返回null看起來並不好?我的意思是如果id不存在,那麼該方法無論如何都會返回null。

先決條件是很好的單線程,但在這種情況下拋出NullPointerException似乎極端。

這是什麼「最佳實踐」?

+1

爲什麼方法簽名不能是'getById(long id)'而不是將NPE推送到服務使用者的代碼? – 2013-03-16 09:04:09

回答

2

將null傳遞給這樣的方法表明存在一個錯誤。沒有人會想要找到具有空ID的實體,因爲不存在這樣的事物。所以這可能意味着在UI層中存在綁定問題,或者調用者忘記在其窗體中添加隱藏的ID字段,或者其他什麼。

返回null隱藏了bug,或者使其更加隱晦。拋出異常提前發現錯誤,並提供明確的錯誤消息,這可以提前修復它,並且使應用程序更加穩定。

對於爲null的非空參數的約定是拋出一個NullPointerException。這就是我要做的。

+0

我選擇了這個答案。最有意義的,因爲可能傳遞null是其他地方的一個問題的暗示。 – 2013-04-04 12:17:03

0

始終最好使用NullPointerException,因爲在Entity集合中沒有找到ID中的值。

1

沒有idnull記錄,因此該方法應該做任何事情,如果給予一個「有效的」id沒有記錄。這是最不讓人驚訝的原則。消費者將編碼爲未找到的情況,因此應該將其涵蓋。

有一件事,新記錄的id什麼是尚未被保存?這可能會導致你的行爲發生偏差null

+0

是的,新記錄的ID爲空。但是,只要它沒有被堅持,反正它不存在,不應該被退回? – 2013-03-16 09:10:11

+0

upvote提及「爲什麼」(原則的最小驚喜) – sbrattla 2013-03-16 09:12:59

+0

但是,如果一個新的記錄交給其他代碼而不被持久化,然後該代碼試圖用它的id做一些事情,你會通過拋出'IllegalArgumentExecption(「只有持久性記錄可以通過id「)'找到,所以在這種情況下你可能會偏離......在任何情況下,返回null通常是一種難聞的氣味,拋出NotFound或返回Optional表示通常更好 – 2013-03-16 09:15:10