【问题标题】:How to resolve findbug issue: Null passed for nonnull parameter如何解决 findbug 问题:为非空参数传递空值
【发布时间】:2016-07-30 07:28:24
【问题描述】:

我收到以下 findbugs 错误:

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

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

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

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

boolean apiStatus = getApiStatus(apiResponse);

有什么想法吗?

【问题讨论】:

  • 被调用的方法有可能处理空异常。在这种情况下,Spotbug 可能是错误的。不是spotbug的问题吗?

标签: java null findbugs


【解决方案1】:

如果CallApi 抛出异常,那么它将被处理并继续控制getApiStatus,除了初始null 之外,不会为apiResponse 分配任何其他内容。

【讨论】:

    【解决方案2】:

    在您的代码中,无论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
    

    【讨论】:

      【解决方案3】:

      我的建议是不处理异常,而是将此方法设置为 throws ApiException。然后在链条的更高位置处理它。如果您的代码在该 try 块中获得异常,然后在 catch 中处理异常,则 apiResponse 很容易为空。然后将继续尝试 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 之前进行一次空值检查,但这不如上述选项更可取。

      【讨论】:

      • 我最终选择了您的第二个选项,因为我想在当前层处理 ApiException 而不是将其传递给业务类。感谢您的详细分析并提供多种选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多