从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
答案 0 :(得分:4)
您正在line
上对if(line.contains(" = "))
进行操作。如果line
是null
,则会抛出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语句都可能导致异常,从而使该代码之后的任何代码成为无效代码。