猿问

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

我在 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


智慧大石
浏览 230回答 2
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块后面的任何代码都可以访问。
随时随地看视频慕课网APP

相关分类

Java
我要回答