java - 为什么 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)
解决方案
对我来说,这看起来不像是一个错误。具体来说,正如 SPEC 所说,似乎自由地允许映射不是一对一的:
也就是说, LineNumberTable 属性可以一起表示源文件的给定行,而不必与源行一一对应。
甚至JDK-15
报错行:
无法读取字段“值”,因为“npeSample”为空
上线9
。
推荐阅读
- python - 计算服务器上的文件上传时间
- c - stat结构负值的st_dev参数
- c++ - 在模板中重载 socket.h 方法
- mongodb - Mongoose 聚合空值问题
- c# - 如何处理来自请求正文的图像
- python - 查找网格中点之间的坐标
- json - Homebridge 上的配置文件中出现无效的 JSON 语法错误
- powershell - Powershell 和 selenium chromedriver 获取 SSL 错误打开网站
- types - 编译器设计 - 当多个转换级别消失时,自动类型转换如何发生
- tensorflow - 使用 Keras 优化黑盒功能的 LSTM