为什么我在 java 中收到无效代码警告?

Why am I getting dead code warning here in 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

您正在使用 if(line.contains(" = "))line 上进行手术。如果 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 块之后的任何代码都可以访问。

if(line == null) 
{
    break;
}

之前
if(line.contains(" = "))

它是死代码的原因是因为两个 if else 语句都可能导致异常,使之后的任何代码成为死代码。