为什么没有在正确的行上报告 NPE

Rai*_*ipe 6 java nullpointerexception stack-trace

运行以下内容:

public class NPESample {

  String value;

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

会给:

Exception in thread "main" java.lang.NullPointerException
    at NPESample.main(NPESample.java:9)
Run Code Online (Sandbox Code Playgroud)

报告的行 (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
Run Code Online (Sandbox Code Playgroud)

输出是:

Exception in thread "main" java.lang.NullPointerException
    at NPESample.main(NPESample.java:7)
Run Code Online (Sandbox Code Playgroud)
javac -version
javac 13.0.1
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 2

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

即,LineNumberTable 属性可以一起表示源文件的给定行,并且不需要与源行是一对一的

甚至JDK-15报错行:

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

在线的9