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

时间:2018-08-20 23:32:00

标签: java dead-code

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 个答案:

答案 0 :(得分:4)

您正在line上对if(line.contains(" = "))进行操作。如果linenull,则会抛出NullPointerException,您没有抓住。因此,无法达到break;语句。如果到达if(line == null)语句,则不是null。从逻辑上讲,break;将永远不会执行,因此无法访问。看来Eclipse正在检测到这一点。注意,仍然可以使用javac进行编译。这只是Eclipse的警告。

此外,如果break;无法访问,则无法结束while(true),因此while块之外的任何内容都是无法访问的。因此,Eclipse也对此发出警告。

逐行读取文件,检查line是否null以指示流结束的通常方法是

String line;
while ( (line = r.readLine() ) != null)
{
    // rest of processing here
}

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

这样,while语句可以正常结束,因此以后无需检查null。这也使得while块之后的所有代码都可以访问。

答案 1 :(得分:0)

放入

if(line == null) 
{
    break;
}

之前

if(line.contains(" = "))

之所以认为它是无效代码,是因为两个if语句都可能导致异常,从而使该代码之后的任何代码成为无效代码。