当前位置: 首页 > 知识库问答 >
问题:

SonarQube Java“可能会在if语句中引发NullPointerException”

路阳华
2023-03-14

我从solarQube中得到了以下一种错误=“NullPointerException可能会被抛出,因为这里的“a”可以为null”。下面是该错误的简单代码示例。

类别:

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描述的错误描述并没有让我更清楚。我如何修复它,有人能向我解释为什么它是错误吗?

共有1个答案

岳嘉悦
2023-03-14

认为运算符优先级:

所以你要理解这个说法:

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))

 类似资料:
  • 我似乎搞不清楚下面的语句与和有关的问题是什么。请记住,仍然在开发中,我只是还没有能够在语句中测试它,所以很可能是错误的。 我得到的错误是: 而语句是这样的。

  • 这个问题是关于C 20的/功能,而不是编译器定义的宏。 本文档(cppreference)仅给出了将它们应用于switch case语句的示例。这个switch-case示例与我的编译器(g-7.2)完美地编译在一起,所以我假设编译器已经实现了这个特性,尽管它还没有在当前的C标准中正式引入。 但是当我这样使用它们时:,我收到了一个警告: “警告:语句开头的属性被忽略[-Wattributes]”。

  •  if 语句,就是类似于「如果○○的话,做●●」,根据条件判断脚本的一部分是否执行的语法。  语法如下: if(expression) 语句或语句块 else 语句或语句块  第一个“语句或语句块”是当 expression 表达式的结果为真时执行的部分,第二个“语句或语句块”则是结果为假时执行的部分。如果不需要 else 以后的部分,可以省略。 例: if(a==b) inform("a和b相等

  • 行动时刻 - 在unlang中使用if语句 if语句本身并不复杂。 它具有以下格式: if(condition){ ... } 由于其许多可能性,条件部分可能变得复杂。 使用if语句获取返回码 我们现在将查看模块的返回代码,并使用此代码与指定的条件进行比较。 FreeRADIUS中的每个模块都需要在调用时返回代码。 随后可以将此代码的值用作if语句中的条件检查。 使用if语句授权用户 如

  • 我有两个问题。 ①当useState初始值真假时,if语句如何适应下面? 比如说。。 ②当if语句为true和false时,如何使setGoodBotton从React钩子和if语句适应下面? 例如…(这不是工作)

  • 问题内容: 如果MySQL触发器中有多个if语句,那么最佳方法是什么? 目前,我的SQL如下所示: 乍看之下,这似乎行得通。但是,我注意到,当多个(else)if语句为true时,仅第一个语句被执行(例如,就像在PHP中一样)。 我如何只使用多个if,而不必是elseif,以便执行多于1条语句?用相同的动作创建多个触发器是不可能的,至少phpMyAdmin所示。将多个if置于一个触发器中会导致错误