java禁止空字符串参数和抛出RuntimeException以阻止方法继续的利弊
假设我在Spring服务层中有以下方法定义:
@Override
public boolean passwordsMatch(String encrypted, String plain) {
if (encrypted == null || encrypted.isEmpty() || plain == null || plain.isEmpty()) {
throw new IllegalArgumentException("One argument is null or empty");
}
return passwordEncoder.matches(plain, encrypted);
}
它由Spring MVC应用程序控制器调用,希望检查用户提供的新密码(此处称为“普通”)是否与用户的当前密码(此处称为“加密”)匹配
如果用户提供的新密码为空(^{
我95%确定我会取消这张支票,但我很想听到在这种特殊情况下支持保留支票的论点
# 1 楼答案
我写得太快了。该方法似乎是一种比较密码的服务方法。这个领域无关紧要。在这种特定情况下,如果提供的参数是
null
,则抛出IllegalArgumentException
是有意义的,但对于空字符串则没有意义,因为它实际上可能是一个密码在涉及域验证的用例中,我不会使用
IllegalArgumentException
。如果User
实例的密码为空,则该实例(或其他任何实例)将不会处于有效状态。因此,您应该抛出某种类型的InvalidDomainException
,例如InvalidPasswordException
(或者使用BindingResult
和Validator
)# 2 楼答案
每当你在一个方法中得到一个你不喜欢的参数时,
IllegalArgumentException
应该是你的第一选择(这正是这个例外的目的)。因此,除非你已经有(或者觉得有必要实现)一个更具体/有意义的例外,我认为为了保持一致性,可以坚持使用IllegalArgument/IllegalState然而,在异常消息中指出您不喜欢的特定参数可能是一个好主意。顺便说一句,Guava通过其^{} 实用程序为此类验证提供了非常好的支持
既然你已经澄清了问题的实际范围,我想说的是,在弄清楚这个方法到底应该检查什么之后,你是唯一一个决定如果提供了null或空参数,你的方法是否应该继续的人
基于您的方法的名称,我想说它最多应该不允许
null
值,因为空密码仍然可以与它们的加密表示相匹配。“最小密码长度”规则最有可能在其他地方实施;这个方法应该只报告普通密码是否与哈希匹配,而不管它是否是合法密码