SONAR抱怨改变条件,以便它不总是评估为" false"

时间:2016-09-14 13:12:14

标签: 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.");
    }
  

我在第4行和第7行(username == null和password == null)

中遇到此错误

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

1 个答案:

答案 0 :(得分:11)

始终评估为false的条件为username == nullpassword == null

我们以username为例。运算符||short-circuiting,表示如果左侧为true,则不会评估右侧。基本上,有两种情况:

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

因此,您可以看到,只要实际评估false条件,结果始终为if (username == null || username.length() < 1) 。这就是SonarQube警告告诉您的内容。

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

username

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

  • null给出的不是false。第一个条件明确评估为true,第二个条件进行评估,可能会返回falseusername
  • null给出的是true。第一个条件清楚地评估为apply plugin: 'java' configurations { proguard } dependencies { "com.foo:proguard:1.2.3" } jar { manifest { attributes('Main-Class': 'some.package.here') } } task proguard { inputs.file jar.archivePath outputs.file jar.archivePath // is this correct? doLast { ant.taskdef(name: 'proguard', classname: 'foo.bar.ProguardTask', classpath: configurations.proguard.asPath) ant.proguard { libraryjar(dir: 'otherfiles/here') // not sure what this does outjar(name: jar.archivePath) } } } assemble.dependsOn proguard proguard.dependsOn jar 和短路。