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

gre*_*Dev 5 java null findbugs

我收到以下 findbugs 错误:

“方法调用为非空参数传递空值:为 getApiStatus(ApiResponse) 的非空参数传递空值”

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

无法将 apiResponse 的空值传递到此代码片段底部的 getApiStatus() 方法中。如何在 apiService.CallApi 方法中执行的 null 检查之上不进行另一个 null 检查的情况下告诉 findbugs 是这种情况?我尝试过使用 NonNull 注释,但这并没有解决问题。这是有问题的代码:

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

boolean apiStatus = getApiStatus(apiResponse);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Man*_*tra 3

我的建议是不处理异常,而是将此方法设置为抛出 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.
}
Run Code Online (Sandbox Code Playgroud)

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

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

或者,正如您所说,在调用 getApiStatus 之前进行空检查,但这并不像上面的选项那么好。