首页 > 解决方案 > 为什么 NPE 没有在正确的行上报告

问题描述

运行以下:

public class NPESample {

  String value;

  public static void main(String[] args) {
    NPESample npeSample = null;
    "foo"
        .replaceAll(
            "f",
            npeSample.value);
  }
}

会给:

Exception in thread "main" java.lang.NullPointerException
    at NPESample.main(NPESample.java:9)

报告的行 (7) 是"foo"发生 NPE (10) 的行而不是实际行npeSample.value

为什么是这样?在调试代码时,我被代码中报告的“错误”行号吓到了。

要重现运行此:

cat > ./NPESample.java <<DELIM
public class NPESample {

  String value;

  public static void main(String[] args) {
    NPESample npeSample = null;
    "foo"
        .replaceAll(
            "f",
            npeSample.value);
  }
}
DELIM

javac NPESample.java
java NPESample

输出是:

Exception in thread "main" java.lang.NullPointerException
    at NPESample.main(NPESample.java:7)
javac -version
javac 13.0.1
java -version
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)

标签: javanullpointerexceptionstack-trace

解决方案


对我来说,这看起来不像是一个错误。具体来说,正如 SPEC 所说,似乎自由地允许映射不是一对一的:

也就是说, LineNumberTable 属性可以一起表示源文件的给定行,而不必与源行一一对应

甚至JDK-15报错行:

无法读取字段“值”,因为“npeSample”为空

上线9


推荐阅读