禁止一个空字符串参数,并在为了防止继续该方法投掷RuntimeException的优点和缺点(Pro

2019-10-18 18:36发布

说我有一个春季服务层下面的方法定义:

@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应用程序控制器称为(这里所说的“加密”)。

如果我真的被抛出一个IllegalArgumentException(或RuntimeException的任何亚型)如果由用户提供的新密码为空plain.isEmpty()

我95%肯定,我要删除此检查,但我很好奇地听到赞成保留支票在这种特殊情况下的参数。

Answer 1:

IllegalArgumentException应该是您的第一选择时,你得到的是你没有的方法(这是此异常的根本目的)内喜欢的理由。 所以,除非你已经拥有(或觉得有必要实现)更具体的/有意义的异常,我认为这是确定与IllegalArgument /非法状态坚持一致性的缘故。

但是,它可能会指出,你不会在异常消息像具体参数是一个好主意。 顺便说一句,番石榴提供此类验证其非常好的支持, Preconditions效用。

Preconditions.checkArgument(encrypted != null && !encrypted.isEmpty(), "The old password hash is empty");
Preconditions.checkArgument(plain != null && !plain.isEmpty(), "The new password is empty");

现在,你已经澄清了实际问题的范围,我会说,你来决定是否提供null或空参数,找出究竟是什么这个方法应该检查后你的方法是否应该进行的唯一一个。

根据您的方法的名字,我会说,它应该至多不允许null值,空密码仍可以对他们的加密表示相匹配。 在“密码长度最小值”规则应该最有可能在其它地方执行; 这种方法应该只报告明文口令是否散列相匹配,无论它是否是一个合法的密码或者没有。



Answer 2:

我写的太快了。 该方法似乎是某种服务方法的比较密码。 域名是无关紧要的。 在这种特殊情况下是有意义的抛出IllegalArgumentException如果提供的参数是null例如,而不是空字符串这实际上可能是一个密码。


在涉及域验证的使用情况,我不会去IllegalArgumentException 。 你的User实例(或其他)不会处于有效状态如果密码是空的。 因此,您应该抛出某种InvalidDomainException ,恩。 InvalidPasswordException (或使用BindingResultValidator )。



文章来源: Pros and cons of forbidding an empty string argument and throwing a RuntimeException in order to prevent the method from proceeding