如何解决 findbug 问题:为非空参数传递空值

How to resolve findbug issue: Null passed for nonnull parameter

我收到以下 findbugs 错误:

"Method call passes null for nonnull parameter : Null passed for nonnull parameter of getApiStatus(ApiResponse)"

如果 CallApi 方法中的 apiResponse 为 null(为简洁起见,此处未显示),它只会抛出一个异常,该异常会在 handleApiException 中捕获,如果我们无法对异常执行任何其他操作,则会再次抛出该异常。

无法将 apiResponse 的空值传递到此代码片段底部的 getApiStatus() 方法。如果不在 apiService.CallApi 方法中完成的空检查之上再做一次空检查,我怎么能告诉 findbugs 是这种情况?我试过使用 NonNull 注释,但这并没有解决问题。这是有问题的代码:

ApiResponse apiResponse = null;
try {
    apiResponse = apiService.CallApi(apiURL, requestObject);
}
catch (ApiException ex) {
    handleApiException(ex);
}

boolean apiStatus = getApiStatus(apiResponse);

有什么想法吗?

如果 CallApi 抛出一个异常,那么它将被处理并且控制将继续到 getApiStatus,除了最初的 null 之外,apiResponse 不会被分配任何东西.

在您的代码中,无论是否发生 ApiException,都会调用 getApiStatus(apiResponse)

你应该改用这个:

try {
    ApiResponse apiResponse = apiService.CallApi(apiURL, requestObject);
    // line bellow will not execute if CallApi throws ApiException
    boolean apiStatus = getApiStatus(apiResponse);
}
catch (ApiException ex) {
    handleApiException(ex);
}
// lines bellow will execute after try-catch block above
// regardless of the ApiException occurring or not

我的建议是不处理异常,而是将此方法设置为抛出 ApiException。然后在链条的上游处理它。如果您的代码在该 try 块中获得异常,然后在 catch 中处理异常,则 apiResponse 很容易为 null。然后将继续尝试 getApiStatus 方法,因此传入 null。

public void yourMethod() throws ApiException {
    ApiResponse apiResponse = apiService.CallApi(apiURL, requestObject);
    boolean apiStatus = getApiStatus(apiResponse);
    // Whatever else you need to do here.
}

您唯一的其他选择是将 apiStatus 调用放在 try 块内的 apiResponse 之下,如下所示:

ApiResponse apiResponse = null;
try {
    apiResponse = apiService.CallApi(apiURL, requestObject);
    boolean apiStatus = getApiStatus(apiResponse);
} catch (ApiException ex) {
    handleApiException(ex);
}

或者,如您所说,在调用 getApiStatus 之前进行空检查,但这不如上面的选项更可取。