SONAR抱怨改变条件,因此它并不总是评估为"假"

Awa*_*Awa 3 java maven sonarqube

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.");
    }
Run Code Online (Sandbox Code Playgroud)

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

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

Tun*_*aki 11

始终评估的条件falseusername == nullpassword == null.

我们举个例子username.运营商||短路意味着,如果左边是它不会评价的右手边true.基本上,有两种情况:

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

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

这里的解决方案是扭转你的两个条件.考虑一下

if (username == null || username.length() < 1)
Run Code Online (Sandbox Code Playgroud)

代替.如果你重新开始并完成每个案例,你会注意到没有一个表达式总会有相同的结果:

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