2016-04-08 47 views
1

我收到以下錯誤了findBUGs:如何解決findbug問題:空通過了非空參數

「方法調用傳遞空非空的參數:空過去了getApiStatus的非空參數(ApiResponse)」

如果apiResponse在CallApi方法(這裏沒有顯示爲簡潔起見)空,就拋出陷入了handleApiException和拋出再次,如果我們不能做任何事情有關異常的異常。

沒有辦法,對於apiResponse空值可以在此代碼片段的鈕被傳遞到getApiStatus()方法。我怎麼能告訴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塊的exeption,然後將處理對捕獲的異常,那麼apiResponse很容易被空。然後就會去嘗試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一個低於try塊內,像這樣:

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 
相關問題