2016-07-25 85 views
0

我寫過一個方法來檢查我的字符串是否在文件中,但是eclipse提供了死代碼警告。這是我的方法:Eclipse死代碼警告,但是出了什麼問題?

private boolean KeyPresent(String key){ 
    try{ 
     BufferedReader fileReader=new BufferedReader(new FileReader(keyPath)); 
     while(true){ 
      String s=fileReader.readLine(); 
      if(s.equals(key)){ 
       fileReader.close(); 
       return true; 
      }else if(s==null){ 
       fileReader.close(); 
       return false; 
      } 
     } 
    }catch(IOException e){ 
      e.getStackTrace() 
      return false; 
    } 
} 

else if(s == null)部分是警告的來源。爲什麼? 如果找不到任何匹配結果(即將到來的輸出全爲空),則返回false。我認爲這是可以的。哪裏不對?

還有一個問題。哪個更好用?

String s; 
while(true){ 
    s="New Value"; 
    .... 
} 

while(true){ 
    String s="new value"; 
    ... 
} 

我認爲垃圾收集器消耗的系統資源,所以第一個是更好的。但是,我在第二個例子中看到了更多的例子。你會用哪一個?

謝謝...

回答

6

看看整個的if/else:

if (s.equals(key)) { 
    ... 
} else if (s == null) { 
    ... 
} 

如果s null,則s.equals(key)會紛紛拋出一個NullPointerException - 所以你永遠不會進入第二個if塊。

你應該使用try-與資源塊,無論如何,並親自我不會趕上IOException要麼...就讓它泡了:

private boolean keyPresent(String key) throws IOException { 
    try (BufferedReader reader = new BufferedReader(new FileReader(keyPath))) { 
     String line; 
     while ((line = reader.readLine()) != null) { 
      if (line.equals(key)) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 

注意,這裏沒有垃圾收集差異;在循環之前聲明變量只是意味着您可以在while條件內賦值。

1

如果s爲空,您的第一個if將被執行並拋出NullPointerException。您的else if無法執行。您必須切換您的ifelse if才能正確處理空指針。

1

Answerd是一個簡單的: 如果s將由空,所以此行中

s.equals(key) 

NullPointerException異常會被拋出,並且PROGRAMM絕不會豐富這

else if (s == null) 

條件。只有s!= null;程序纔會豐富這個條件;所以這個條件總是會是false。 你最好用這種方式重寫這段代碼:

while (true) { 
      String s = fileReader.readLine(); 
      if (s == null) { 
       fileReader.close(); 
       return false; 
      } else if (s.equals(key)) { 
       fileReader.close(); 
       return true; 
      } 
     }