声纳严重违规 - 以前取消引用的Nullcheck值

时间:2014-11-03 20:23:35

标签: java

对于我在我的一个测试类中的下面一段代码,Sonar抛出了一个严重的违规行为 - 正确性 - 以前取消引用的Nullcheck值

 if (testLst != null && !testLst.isEmpty()) {
        for (Test test : testLst) {
            if (test.getName().equalsIgnoreCase("TEST")) {
            // do blah
            }

如果有人在这里做错了,可否有人对此有所了解?

编辑:这里的答案之一建议这是因为我之前可以访问变量,因此空检查是多余的。但事实并非如此。这是我的空检查之前的代码行。

 testLst = myTest.getValues(); //I am basically populating the array by doing a get, but I am not accessing the list itself by doing a get on it directly - like testLst.get()
 if (testLst != null && !testLst.isEmpty()) {
            for (Test test : testLst) {
                if (test.getName().equalsIgnoreCase("TEST")) {
                // do blah
                }

3 个答案:

答案 0 :(得分:14)

当您检查变量的值是否为空(在本例中为testLst)时,会显示此消息,而您之前已经访问过该变量。不需要进行空检查,因为如果值为null,则会抛出NullPointerException

示例:

testLst.remove(something);
if (testLst != null && !testLst.isEmpty()) {
    for (Test test : testLst) {
       if (test.getName().equalsIgnoreCase("TEST")) {
        // do blah
        }

检查testLst != null是多余的,因为在程序到达if语句时,testLst不能为空,否则先前的语句testLst.remove(something)将抛出{ {1}}。在这种情况下,您应该在访问NullPointerException之前在 为空的地方进行空检查:

testLst

答案 1 :(得分:0)

我知道我对OP来说来不及了,但也许其他人可能会发现此帮助:

Sonarqube在该行上抛出此错误,这将导致初始NPE,而不是包含冗余null检查的行(错误消息另有说明)

对于OP:

w\n

我猜getValues()从不返回null,因此testLst不能为null,而只能在null检查时为空。

答案 2 :(得分:-1)

testLst = myTest.getValues(); //I am basically populating the array by doing a get, but I am not accessing the list itself by doing a get on it directly - like testLst.get()
if (testLst != null && !testLst.isEmpty()) {
    for (Test test : testLst) {
        if (test.getName().equalsIgnoreCase("TEST")) {
        // do blah
        }

你检查过myTest!= null? 否则声纳会抛出严重的违规行为。