2016-03-10 65 views
2

我有以下代碼:FindBugs:什麼是最好的解決方法「方法忽略InputStream.skip()的結果」?

final Response res = this.origin.act(req); 
for (int count = req.body().available(); count > 0; 
    count = req.body().available()) { 
    body().skip(count); 
} 
return res; 

FindBugs的報告中體()這個問題跳過(計數)

FindBugs: L B RR: ignores result of java.io.InputStream.skip(long)

什麼是最好的解決這個問題的方法?

由於

+2

有鏈接到爲什麼忽略跳過的返回值可能會導致問題的FindBugs的描述一個更好的解決方案。你堅持哪部分解釋? – beresfordt

+0

@beresfordt我知道這是什麼問題....我在談論解決問題的最佳方法..你如何解決問題? –

回答

2

該方法忽略java.io.InputStream.skip(),它可以跳過多個字節的返回值。如果未檢查返回值,則調用者將無法正確處理比呼叫者所請求的跳過的字節更少的情況。這是一個特別隱祕的錯誤,因爲在許多程序中,輸入流中的跳過通常會跳過所請求的全部數據量,導致程序偶爾失敗。但是,使用緩衝流時,skip()將只跳過緩衝區中的數據,並且通常無法跳過所請求的字節數。

爲了避免findbugs警告,並且忽略返回值的bug可能會被掩蓋,您需要檢查返回值是否與請求跳過的數字匹配;例如:

final Response res = this.origin.act(req); 
for (int count = req.body().available(); count > 0; 
    count = req.body().available()) { 
    long skippedBytes = body().skip(count); 
    if (skippedBytes != count) { 
     // do something 
    } 
} 
return res; 

如果它們不匹配,你應該做的'事情'是你需要依賴這種情況的選擇;你可能想拋出一個異常,你可能想要記錄和繼續,或者你可能想要執行某種後備等等等

0

@beresfordt謝謝。我想我發現使用ByteStreams.skipFully(req.body(), count);

final Response res = this.origin.act(req); 
for (int count = req.body().available(); count > 0; 
    count = req.body().available()) { 
    ByteStreams.skipFully(req.body(), count); 
} 
return res; 
相關問題