【问题标题】:SONAR complaining to change the condition so that it does not always evaluate to "false"SONAR 抱怨改变条件,使其并不总是评估为“假”
【发布时间】:2017-01-22 07:33:51
【问题描述】:
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 行遇到此错误(用户名 == null 和密码 == null)

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

【问题讨论】:

  • 交换条件。在测试长度之前,您应该检查null

标签: java maven sonarqube


【解决方案1】:

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

我们以username 为例。运算符||short-circuiting,这意味着如果左侧是true,它将不会评估右侧。基本上有两种情况:

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

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

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

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

相反。如果您重新开始并检查每个案例,您会注意到没有一个表达式将始终具有相同的结果:

  • 给定的username 不是null。第一个条件明确计算为false,第二个条件被计算,可能返回truefalse
  • 给定的usernamenull。第一个条件明确评估为true 和短路。

【讨论】:

  • 感谢您花时间向我解释我的错误。
猜你喜欢
  • 2018-10-04
  • 2018-05-07
  • 2018-08-01
  • 2021-01-05
  • 2018-08-17
  • 2017-06-12
  • 1970-01-01
  • 2018-02-10
  • 2016-11-25
相关资源
最近更新 更多