为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我在 Java 中收到死代码警告?

为什么我在 Java 中收到死代码警告?

智慧大石 2021-08-04 10:29:01
我在 eclipse 中从if(line == null)语句到r.close()语句收到死代码警告。BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));int counter = 0;while(true){    String line = r.readLine();    counter++;    if(line.contains(" = "))    {        String[] keyVal = new String[2];        keyVal[0] = line.substring(0, line.indexOf(" = ") - 1);        keyVal[1] = line.substring(line.indexOf(" = ") + 3);        buffer.add(keyVal);    }    else    {        new Exception("Invalid expression at line " + counter + " in file " + file.getPath()).printStackTrace();    }    if(line == null) // dead code here    {        break;    }}System.out.println("here is a dead code");r.close(); // another dead code
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

您正在line使用if(line.contains(" = ")). 如果line是null,aNullPointerException会被抛出,你没有抓住。因此,break;无法达成该声明。如果if(line == null)达到该语句,则不是null。从逻辑上讲,break;永远不会执行,因此无法访问。Eclipse 似乎正在检测到这一点。请注意,这仍然可以用 javac 编译;这只是 Eclipse 的警告。


此外,如果break;是不可达的,那么就没有办法结束while(true),所以while块之外的任何东西都是不可达的。因此 Eclipse 也会对此发出警告。


逐行读取文件、检查linefornull以指示流结束的常用方法是


String line;

while ( (line = r.readLine() ) != null)

{

    // rest of processing here

}

这不是最干净的代码,在与相等检查相同的表达式中赋值,但它是执行这种读取和检查操作的常用方法。


这样while语句就可以正常结束了,以后就不用再检查了null。这也使得while块后面的任何代码都可以访问。


查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 228 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信