getUser
,它从数据库中检索用户。该方法要求您通过userExists(String username)
方法验证用户是否实际存在。如果调用
getUser
方法时用户不存在,我想抛出未经检查的异常,但是哪种异常在这里最合适呢?我考虑过IllegalArgumentException
,但感觉不完全正确,因为某些输入在某些情况下可能是可以的,而在其他情况下则不可以,它们并不严格“非法”。您有什么建议吗?getUser
,它从数据库中检索用户。该方法要求您通过userExists(String username)
方法验证用户是否实际存在。getUser
方法时用户不存在,我想抛出未经检查的异常,但是哪种异常在这里最合适呢?我考虑过IllegalArgumentException
,但感觉不完全正确,因为某些输入在某些情况下可能是可以的,而在其他情况下则不可以,它们并不严格“非法”。您有什么建议吗?对我来说,IllegalArgumentException表示参数不合法且总是不合法的。 我会使用IllegalStateException异常来表示要检查用户无效的对象状态。
但是,如果您有足够具体的异常,可以创建自己的异常。
public class UsernameNotCheckedException extends IllegalStateException {
public UsernameNotCheckedException(String message) {
super(message);
}
}
这可能会使调试变得更容易。
NumberFormatException
是 IllegalArgumentException
的一个子类。如果你尝试解析数字 12QW4
,它将导致抛出 NumberFormatException
,并且无法后续使其成为有效的参数。即它与任何状态无关。
IllegalStateException
的 Javadoc 描述如下:
表示方法在不合适或不适当的时间被调用。换句话说,Java 环境或 Java 应用程序未处于请求操作的适当状态。
IllegalStateException
表示“在非法或不适当的时间调用方法”。换句话说,调用方法的是对象的状态,而不是参数不正确。选择其他异常会更好。 - BohemianString
的状态,因为它是不可变的。只有被调用的对象的状态意味着该方法在该时间不能使用该用户名进行调用。 - Peter LawreyIllegalStateException
不是正确的选择。 IllegalStateException
指的是调用其方法的对象的状态-即调用它的this
的状态不正确。在您的情况下,this
(即数据库服务器)没有问题,而是“用户”不正确。
IllegalArgumentException
是正确的选择-是“用户”不正确,而不是服务器。
另一个有效的选项是抛出自己的特定于域的异常,例如UnknownUserException
,但如果此情况“罕见”或意外且无法恢复,则可以使用IllegalArgumentException
。
我不会抛出任何异常,只会简单地返回null
。或者我会抛出一个名为UserDoesNotExistException
的功能性异常。
这是我的理由:IllegalStateException
用于当用户调用某个方法时该对象的状态不允许时使用。在这里,导致异常的不是对象的状态,而是用户在数据库中不存在。
您可能会认为用户应该先调用userExists
,甚至可以使用实例字段记住使用此参数调用它的事实,以便getUser
可以抛出IllegalStateException
,而无需进入数据库。
但是,这里的问题是,在之前调用userExists
可能并没有任何帮助:它将执行查询以检查用户是否存在,然后getUser
将执行第二个查询,并且无法保证找到该用户,因为另一个事务可能已将其删除。