为什么编译器会发出“潜在空指针访问”警告?

问题描述 投票:0回答:1

[JDK/JRE 8、Windows 8.1 64 位]

所以我有一个类似这样的代码:

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")) {

为什么会出现这种情况?

java exception null
1个回答
2
投票

我怀疑您只是遇到了所使用的静态分析的限制。 警告消息确实说“潜在”。 在这种情况下,可能是因为条件

(s = reader.readLine()) != null
很难完全传播。

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

您可以安全地忽略它(前提是代码实际上按您的预期工作!),或者添加注释来抑制该警告。

© www.soinside.com 2019 - 2024. All rights reserved.