Java 服务层:如果查询参数为null,返回什么?

Java 服务层:如果查询参数为null,返回什么?,java,nullpointerexception,illegalargumentexception,method-parameters,Java,Nullpointerexception,Illegalargumentexception,Method Parameters,假设我们有一个服务方法getById(Long id),它根据实体的id返回一个实体。如果id为null,正确的操作是什么 抛出IllegalArgumentException 抛出NullPointerException?(guavas Premissions.checkNotNull执行此操作) 返回空值 因为永远不可能存在id==null的实体,所以返回null似乎没有那么糟糕?我的意思是,如果id不存在,该方法将返回null 先决条件是很好的一行程序,但在这种情况下抛出NullPoint

假设我们有一个服务方法
getById(Long id)
,它根据实体的id返回一个实体。如果id为null,正确的操作是什么

抛出IllegalArgumentException

抛出NullPointerException?(guavas Premissions.checkNotNull执行此操作)

返回空值

因为永远不可能存在id==null的实体,所以返回null似乎没有那么糟糕?我的意思是,如果id不存在,该方法将返回null

先决条件是很好的一行程序,但在这种情况下抛出NullPointerException似乎是极端的


“最佳实践”是什么此处?

始终最好使用
NullPointerException
,因为在实体集合中找不到ID中的值。

始终最好使用
NullPointerException
,因为在实体集合中找不到ID中的值。

没有ID为的
记录
null
因此,如果给定一个没有记录的“有效”
id
,则该方法应该执行任何操作。这是最不出人意料的原则。消费者将对未找到的情况进行编码,因此应将其包括在内


有一件事,尚未持久化的新记录的
id
是什么?如果恰好是
null

没有
id
null
的记录,则可能会导致您偏离您的行为。因此,如果提供了一个没有记录的“有效”
id
,则该方法应该执行任何操作。这是最不出人意料的原则。消费者将对未找到的情况进行编码,因此应将其包括在内


有一件事,尚未持久化的新记录的
id
是什么?如果恰好是
null

将null传递给此类方法表示存在错误,则可能会导致您偏离您的行为。没有人会想找到ID为空的实体,因为这样的实体不可能存在。因此,这可能意味着UI层中存在绑定问题,或者调用方忘记以其形式添加隐藏的ID字段,或者其他什么

返回null会隐藏错误,或使其更加模糊。抛出异常会尽早发现错误,并显示一条清晰的错误消息,这允许尽早修复错误,并最终使应用程序更加健壮


不可为null的参数的约定是抛出NullPointerException。这就是我要做的。

将null传递给这样的方法表示存在错误。没有人会想找到ID为空的实体,因为这样的实体不可能存在。因此,这可能意味着UI层中存在绑定问题,或者调用方忘记以其形式添加隐藏的ID字段,或者其他什么

返回null会隐藏错误,或使其更加模糊。抛出异常会尽早发现错误,并显示一条清晰的错误消息,这允许尽早修复错误,并最终使应用程序更加健壮


不可为null的参数的约定是抛出NullPointerException。这就是我要做的。

为什么方法签名不能是
getById(long id)
而将NPE推送到服务消费者的代码?为什么方法签名不能是
getById(long id)
而将NPE推送到服务消费者的代码?是的,新记录的id为空。但是,只要它没有被持久化,它就不存在,也不应该被返回?但是如果一个新记录在没有被持久化的情况下被传递给其他代码,然后该代码试图用它的id做一些事情,那么抛出
IllegalArgumentExecption(“id只能找到持久化的记录”)会更快失败
因此,在这种情况下,您可能会偏离。。。在任何情况下,返回null通常都是一种不好的气味,抛出一个
NotFound
或返回一个
Optional
通常更好如果新记录的
id
null
null
表示一个新记录,并且
getById
方法无法处理尚未持久化的记录,因此,在这种情况下抛出异常,因为存在ID为
null
ID的记录,但服务层可能无法找到它们。如果创建新记录时每次都生成ID,则不存在ID为
null
ID的(持久化或非持久化)记录,因此此类记录的唯一含义是“未找到”。如果有多个含义,“未找到”是最不重要的,则新记录的id为null。但是,只要它没有被持久化,它就不存在,也不应该被返回?但是如果一个新记录在没有被持久化的情况下被传递给其他代码,然后该代码试图用它的id做一些事情,那么抛出
IllegalArgumentExecption(“id只能找到持久化的记录”)会更快失败
因此,在这种情况下,您可能会偏离。。。在任何情况下,返回null通常都是一种不好的气味,抛出一个
NotFound
或返回一个
Optional
通常更好如果新记录的
id
null
null
表示一个新记录,并且
getById
方法无法处理尚未持久化的记录,因此,在这种情况下抛出异常,因为存在ID为
null
ID的记录,但服务层可能无法找到它们。如果创建新记录时每次都生成ID,则不存在ID为
null
ID的(持久化或非持久化)记录,因此此类记录的唯一含义是“未找到”。如果你有多重含义,“未找到”是最不重要的我选择了这个答案。最有意义的是,传入null可能是其他地方出现问题的提示。我选择了这个答案。最有意义的是,传入null可能是其他地方出现问题的提示。