【问题标题】:SonarQube Java 'NullPointerException might be thrown' in if statement如果语句中的 SonarQube Java 'NullPointerException 可能会被抛出'
【发布时间】:2018-07-10 14:43:15
【问题描述】:

我从 solarQube = " 收到一种以下错误 可能会抛出 NullPointerException,因为 'a' 在这里可以为空"。下面是错误的简单代码示例。

班级:

class A {
int a1;
int a2;

public A () {
}

public int getA1() {
    return a1;
}

public int getA2() {
    return a2;
}
}

然后我有一个使用上面的类作为参数的方法:

public boolean testMethod(A a) {
    if(a != null && a.getA1() != 1 || a.getA2() != 2) {
        return true;
    }
    return false;   
}

我收到了 SonarQube 突出显示的 a.getA2 != 2 错误。我只是无法理解这些陈述的问题。 SonarQube 描述的错误描述并没有让我更清楚。我该如何解决它,任何人都可以向我解释为什么它是一个错误?

【问题讨论】:

  • 您当前正在尝试访问两个字段getA1getA2,而不是调用方法getA1()getA2()。这是故意的吗?因为这不会编译。
  • 对不起,我的错。我忘了括号;)

标签: java if-statement nullpointerexception sonarqube


【解决方案1】:

想想the operators precedence&& 的优先级高于||
具有较高优先级的运算符在具有相对较低优先级的运算符之前进行评估。

所以你必须明白这句话:

if(a != null && a.getA1() != 1 || a.getA2() != 2)

不管是不是写的:

        // Evaluated together       // Evaluated then
if( (a != null && a.getA1() != 1) || a.getA2() != 2)

所以a.getA2() != 2 没有null 支票。

为了防止NullPointerException,您必须编写的内容是对需要这样做的两个布尔表达式的求值进行分组。
你可以用括号括起来:

if(a != null && (a.getA1() != 1 || a.getA2() != 2))

【讨论】:

  • 酷!它对我有用。但我还是无法理解。是运算符 && 还是放在括号内的语句具有更高的优先级?哦,无论如何,谢谢。
  • 欢迎您。我还是更新了 :) && 的优先级高于 ||。所以要以这种方式对A && B || C 分组A && B || C 的结果,您必须添加括号,例如:A && (B || C)
猜你喜欢
  • 2021-03-12
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 2021-03-22
  • 2021-06-06
相关资源
最近更新 更多