2016-07-25 38 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; 
      } 
     }