2013-03-05 79 views
4

我不明白爲什麼Eclipse的給了我一個死代碼在第二的代碼警告,如果條件:死代碼警告在while循環與2,如果是

boolean frameErreicht = false; 
    while (!frameErreicht) { 
     String line = reader.readLine(); 
     if (line.matches("@\\d*")) { 
      reader.mark(reader.getLineNumber() - 1); 
      reader.setLineNumber(reader.getLineNumber() - 1); 
      frameErreicht = true; 
     } 
     if (line == null) 
      throw new IOException("Keine Angaben zu Frames im Eingabestrom"); 
    } 

的ReadLine()方法的jdoc LinenumberReader說,如果到達流的末尾,它將返回null,所以如果在整個文本(line == null)中找不到匹配,它應該拋出異常。
但是怎麼了?

+0

是不是因爲你」重新檢查line.matches?當它碰到下面的行時它不能爲空,因爲訪問會導致拋出?在呼叫匹配之前進一步移動空檢查。 – SpaceBison 2013-03-05 18:53:34

+2

換句話說,你從來沒有運行過它?爲什麼在跑步之前詢問 – BalusC 2013-03-05 18:54:03

回答

14

如果行已經爲空,line.matches("@\\d*")會拋出一個NullPointerException

+1

+1打我吧:) – mellamokb 2013-03-05 18:53:20

+0

@mellamokbtheWise同樣的東西:) – bsiamionau 2013-03-05 18:53:56

2

它死了,因爲你以前解除引用在4號線以保證其不爲空,否則你會得到NullPointerException異常指針「行」。

+1

如果你認爲這是一個很好的答案,而不是發佈一個副本,請只投票現有的答案。 – mellamokb 2013-03-05 18:57:21

+0

是的,當我打我的時候,答案一定會彈出... – Marcin 2013-03-05 19:02:01

1

第一:

boolean found = false; 
String line = null; 
while ((line=reader.readLine())!=null) { 
    if (line.matches("@\\d*")) { 
     reader.mark(reader.getLineNumber() - 1); 
     reader.setLineNumber(reader.getLineNumber() - 1); 
     found=true; 
     break; 
    } 
} 
if(!found) throw new IOException("Keine Angaben zu Frames im Eingabestrom"); 

而且你是不是做這個檢查在每行...

這個代碼不應該返回任何死代碼...

+3

爲什麼要刪除OP的意圖拋出'IOException'?解決方案只是交換if。 – BalusC 2013-03-05 18:59:33

+0

加回來... – Alex 2013-03-05 19:06:09