声纳抱怨改变条件,使其并不总是评估为"false"


public String generateURLSafeToken(String username, char[] password) throws CredentialTokenException {
    this.tokenValid = false;
    String token = null;
    if ((username.length() < 1) || (username == null)) {
        throw new CredentialTokenException("Username cannot be an empty string or null.");
    }
    if ((password.length < 1) || (password == null)) {
        throw new CredentialTokenException("Password cannot be an empty or null.");
    }

我在第 4 行和第 7 行遇到此错误(用户名 == 空,密码 == 空(

我的代码中需要这部分。我正在尝试 isEmpty(( 而不是 null,但也面临问题.修复此SONAR错误的替代方法或解决方案是什么

总是计算结果为false的条件是username == nullpassword == null

让我们以username为例。操作员||短路,这意味着如果左侧true,它不会评估右侧。基本上,有两种情况:

  • 给出的username不是null.评估username.length() < 1的条件
    • 如果结果是true,我们直接返回并进入if分支
    • 如果结果是false,我们尝试评估username == null。但是由于给出的username不是null,这总是计算为false
  • 给出usernamenull .评估条件username.length() < 1。这实际上就到此为止:它会抛出一个NullPointerException并且不会评估右侧。

因此,您可以看到,无论何时实际评估username == null条件,结果总是false。这就是SonarQube警告告诉你的。

这里的解决方案是扭转您的 2 个条件。考虑拥有

if (username == null || username.length() < 1)

相反。如果您重新开始并浏览每种情况,您会注意到没有一个表达式将始终具有相同的结果:

  • 给出的username不是null.第一个条件清楚地计算为 false,第二个条件被评估,这可能会返回truefalse
  • 给出的usernamenull .第一个条件清楚地评估为true和短路。

相关内容

最新更新