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