2015-04-27 20 views
2

我加入FindBugs的插件到我的項目,我突然開始得到以下錯誤:Dereference of the result of readLine() without nullcheckFindBugs的 - 處理空檢查和編碼在讀取輸入流

我有下面的代碼逐行讀取HTTP請求行:

InputStream input = clientSocket.getInputStream(); 

String line; 
while (!(line = in.readLine()).equals("")) { 
... 
} 

我試圖改寫這一進其他一些與nullcheck:

String line = ""; 
while (line != null) { 
    line = in.readLine(); 

    if (line.equals("")) return; 
} 

但這被永遠困(因此它不重寫ç orrectly)。我是這樣一個基本的問題,抱歉,但我似乎無法得到它的權利......

標記爲錯誤的另一件事是Found reliance on default encoding in ..InputStream...

我怎樣才能在InputStreamReader的指定編碼?

+2

是否有一個特殊的原因,你返回一個空字符串?試圖解析HTTP標頭?當輸入結束時,readLine()將返回null,而不是空字符串 –

回答

2

固定循環看起來像這樣:

InputStream input = clientSocket.getInputStream(); 

String line; 
while (null != (line = in.readLine())) { 
    if("".equals(line)) break; 
    ... 
} 

爲什麼?首先,遠程端(客戶端)關閉連接,readLine()將返回null。外部支票的防範措施。

readLine()如果客戶端剛停止發送數據,則根本不會返回。所以只要客戶端保持連接打開,你的「固定」循環就會掛起。

當比較字符串常量,我總是把他們先:

"".equals(line)) 

永遠不會失敗,即使linenull。因爲你經常想知道你在比較什麼,所以它通常更具可讀性;你想檢查的變量不太「信息量」。

+0

謝謝,這有效,不像其他解決方法) – Smajl

0

顯然readLine可以返回null,讓你有line = in.readLine();

你更新的代碼後,檢查它仍然拋出NullPointerException,如果readLine返回null

0

我懷疑你的變化將工作,因爲支票被上線的以前值進行,因此,如果您的前行是有效的(但你在哪裏讀的最後一行)的任何後續調用可潛在產量一個NullPointerException

解決這個問題的旅途中,通常可以採用以下模式應用於:

InputStream input = clientSocket.getInputStream(); 

String line = ""; 
while ((line = in.readLine()) != null) { 
    ... 
} 
+0

行'String line =「」;'對我來說看起來不太合適。我更喜歡'String line;'因爲在任何地方都沒有使用空字符串。 – michaldo

+0

@michaldo:你的方法存在的問題是,如果你對字符串進行了操作,那麼執行'String line''可能會導致'NullPointerExcetpions'進一步下降。將其分配爲空是解決此問題的一種方法。 – npinti