sonarqube-可以抛出“nullpointerexception”;

y4ekin9u  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(757)

sonarqube向我报告此错误: A "NullPointerException" could be thrown; "getBody()" can return null. 代码如下:

if (holdingResponseEntity == null || holdingResponseEntity.getBody() == null || holdingResponseEntity.getBody().getError() || holdingResponseEntity.getBody().getResult() == null) { throw new HoldingNotFoundException("Holding whit id=" + idHolding + " not found-"); }
eit6fx6z

eit6fx6z1#

不过,也有其他方法来解决这个问题,正如上面所回答的,但如果我想解决它的方式,你写的代码与最小的变化,避免从声纳警告,这将是如下所示-
使用&&operator将确保一旦条件失败,它不会检查后续条件,从而解决问题。

if(holdingResponseEntity != null &&
                holdingResponseEntity.getBody() != null &&
                holdingResponseEntity.getBody().getError() != null &&
                holdingResponseEntity.getBody().getResult() != null){
           //Everything is good if it comes here

        }else{
            System.out.println("Going to throw*****");
            throw new HoldingNotFoundException("Holding whit id=" + idHolding + " not found-");
        }
kb5ga3dv

kb5ga3dv2#

从理论上讲,一次又一次的呼叫 getBody() 可能返回其他值。以下利用 hasBody() 还有电话 getBody() 只有一次。

if (holdingResponseEntity == null
        || !holdingResponseEntity.hasBody()) {
    throw new HoldingNotFoundException("Holding with id=" + idHolding + " not found.");
}
T body = holdingResponseEntity.getBody(); // Change T appropriately.
if (body.getError() || body.getResult() == null) {
    throw new HoldingNotFoundException("Holding with id=" + idHolding + " not found.");
}

通常您应该检查库的源代码 getBody . 我猜:它不是一个简单的获得者,而是一次构造身体。因为有一个 hasBody .
这样的事情使得代码检查器很有价值。

dgiusagp

dgiusagp3#

你先测试一下 getBody() 退货 null .
sonarqube看到了这一点,认为该方法可以返回null。
然后,再次调用相同的方法。sonarqube只知道该方法可以返回null,因此它会告诉您警告。
换句话说,sonarqube认为它可以返回与 null 第一次却回来了 null 第二次。
如果方法只是一个简单的getter,并且对象没有并发修改,那么这就没有问题了。
要删除警告,可以执行以下操作之一:
保存的结果 getBody() 对于一个变量,检查它是否为null,如果不是则继续
添加 //NOSONAR 你应该知道自己在做什么。
请注意,如果您决定使用第二种情况,您可能需要在注解中解释为什么这是可以的。

相关问题