2016-04-08 6 views
1

Я получаю следующее сообщение об ошибке: FindBugsКак решить проблему findbug: Null перевалил за ненулевой параметр

«Метод вызова проходит нуль для ненулевого параметра: Null передается для ненулевого параметра getApiStatus (ApiResponse)»

Если apiResponse имеет значение null в методе CallApi (для краткости здесь не показано), он просто выдает исключение, которое попадает в handleApiException и снова бросается, если мы ничего не можем сделать об исключении.

Невозможно передать пустое значение для apiResponse в метод getApiStatus() в botton этого фрагмента кода. Как я могу указать findbugs, что это так, не выполняя еще одну проверку нуля поверх нулевой проверки, которая выполняется в методе apiService.CallApi? Я пробовал использовать аннотацию NonNull, но это не решило проблему. Вот этот код:

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

boolean apiStatus = getApiStatus(apiResponse); 

Любые идеи?

ответ

2

Мое предложение было бы НЕ обрабатывать исключение, но установить этот метод бросает ApiException. И затем обработайте его выше цепи. Если ваш код получает освобождение в этом блоке try, то обрабатывает исключение в catch, тогда apiResponse может быть легко null. И затем перейдем к методу getApiStatus и, следовательно, передадим нулевое значение.

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

Ваш только другой вариант, чтобы поставить вызов apiStatus ниже apiResponse один внутри блока попробовать, например, так:

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

Или, как вы говорите, сделать нулевую проверку перед вызовом getApiStatus, но это не так предпочтительнее, как выше.

+1

Я закончил свой второй вариант, потому что хотел обработать ApiException на текущем уровне, а не передавать его бизнес-классу. Благодарим за подробный анализ и предоставим несколько вариантов. – greenJavaDev

1

Если CallApi выбрасывает исключение, то он будет обработан и контроль будет продолжать getApiStatus без apiResponse когда-либо присвоенного ничего, кроме начального null.

2

В вашем коде getApiStatus(apiResponse) будет вызываться независимо от ApiException, происходящего или нет.

Вы должны вместо этого:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^