有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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应用程序控制器调用,希望检查用户提供的新密码(此处称为“普通”)是否与用户的当前密码(此处称为“加密”)匹配

如果用户提供的新密码为空(^{),我真的应该抛出IllegalArgumentException(或RuntimeException的任何子类型)

我95%确定我会取消这张支票,但我很想听到在这种特殊情况下支持保留支票的论点


共 (2) 个答案

  1. # 1 楼答案

    我写得太快了。该方法似乎是一种比较密码的服务方法。这个领域无关紧要。在这种特定情况下,如果提供的参数是null,则抛出IllegalArgumentException是有意义的,但对于空字符串则没有意义,因为它实际上可能是一个密码


    在涉及域验证的用例中,我不会使用IllegalArgumentException。如果User实例的密码为空,则该实例(或其他任何实例)将不会处于有效状态。因此,您应该抛出某种类型的InvalidDomainException,例如InvalidPasswordException(或者使用BindingResultValidator

  2. # 2 楼答案

    每当你在一个方法中得到一个你不喜欢的参数时,IllegalArgumentException应该是你的第一选择(这正是这个例外的目的)。因此,除非你已经有(或者觉得有必要实现)一个更具体/有意义的例外,我认为为了保持一致性,可以坚持使用IllegalArgument/IllegalState

    然而,在异常消息中指出您不喜欢的特定参数可能是一个好主意。顺便说一句,Guava通过其^{}实用程序为此类验证提供了非常好的支持

    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值,因为空密码仍然可以与它们的加密表示相匹配。“最小密码长度”规则最有可能在其他地方实施;这个方法应该只报告普通密码是否与哈希匹配,而不管它是否是合法密码