为什么编译器指出这个“潜在的空指针访问”警告?

时间:2014-06-13 00:42:18

标签: java exception compiler-construction null

[JDK / JRE 8,Windows 8.1 64-Bit]

所以我的代码有点像这样:

File file = ...;
BufferedReader reader = ...;
String s;

while ((s = reader.readLine()) != null) {
  s = s.replace("10", "100");

  if (s.startsWith("100100")) {
    ...
  }
}

直到那里,一切正常。

但是,如果我给出任何条件来执行String.replace,例如:

File file = ...;
BufferedReader reader = ...;
String s;

while ((s = reader.readLine()) != null) {
  if (file.getName().startsWith("X_")) {
    s = s.replace("10", "100");
  }

  if (s.startsWith("100100")) {
    ...
  }
}

然后,编译器在Potential null pointer access: The variable s may be null at this location给我一个警告if (s.startsWith("100100")) {

为什么会这样?

1 个答案:

答案 0 :(得分:2)

我怀疑你刚刚遇到静态分析的局限性。警告信息确实说“潜在”。在这种情况下,可能是因为条件(s = reader.readLine()) != null很难完全传播。

像这样的静态分析通常是启发式的,可能并不总是完全符合您的预期。它们作为提示非常有用,但它们并非绝对可靠。

您可以放心地忽略它(假设代码实际上按照您的意图工作!),或者可能添加注释来抑制该警告。