在if语句中可能会抛出SonarQube Java'NullPointerException'

des*_*sta 0 java if-statement nullpointerexception sonarqube

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

班级 :

class A {
int a1;
int a2;

public A () {
}

public int getA1() {
    return a1;
}

public int getA2() {
    return a2;
}
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

dav*_*xxx 6

考虑运营商的优先级:&&优先级高于||.
优先级较高的运算符在优先级相对较低的运算符之前进行求值.

所以你必须理解这个陈述:

if(a != null && a.getA1() != 1 || a.getA2() != 2)
Run Code Online (Sandbox Code Playgroud)

无论是否写得:

        // Evaluated together       // Evaluated then
if( (a != null && a.getA1() != 1) || a.getA2() != 2)
Run Code Online (Sandbox Code Playgroud)

所以a.getA2() != 2没有null检查.

您必须编写的要防止的内容NullPointerException是对需要的两个布尔表达式的求值进行分组.
你可以用括号围绕它们来做到这一点:

if(a != null && (a.getA1() != 1 || a.getA2() != 2))
Run Code Online (Sandbox Code Playgroud)