如何解决 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 之前进行空检查,但这不如上面的选项更可取。
我收到以下 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 之前进行空检查,但这不如上面的选项更可取。