Java 14 来势汹汹,这回让空指针无处遁形!!

简介: 相信在坐的每一位 Java 程序员都遇到过空指针异常: NullPointerException(NPE),不甚其烦。栈长之前也分享几篇避免空指针的文章:

相信在坐的每一位 Java 程序员都遇到过空指针异常: NullPointerException(NPE),不甚其烦。


栈长之前也分享几篇避免空指针的文章:


别再写 bug 了,避免空指针的 5 个案例!

没用 Java 8,怎么优雅地避免空指针?

空指针异常神鬼莫测,它几乎可以出现在程序中的任何位置,想尝试捕获处理是不太切实际的。


背景

我们一般要通过 JVM 异常报告的代码位置去处理,JVM 会打印出导致空指导异常的详细类名、方法名以及行号,如以下异常所示:

Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:3)

很显然,Test 类的 main 方法第 3 行发生了空指针异常,如果第 3 行的代码是:


javastack.name = '栈长';


这时候我们肯定能判定 javastack 对象为 null,如果是下面这段呢:


javastack.name = params.user.name;


以下这 e 个对象都可能为空:


javastack

params

user

这时候就无法通过 JVM 报告的位置所判定到底是哪个变量为空了,每一个对象都可能是空指针的入口,只能通过输出日志或者 Debug 调试去跟踪了。


如果 JVM 可以提供足够明确的信息以显示空指针异常的具体来源,而无需额外的代码、工具来定位,那么这对开发人员、或者线上问题定位都举足轻重。当然,这个在商业 JVM 早就做到了,Java 14,它现在也终于来了。


详细的空指针异常信息

详细可以看官方这篇介绍:

https://openjdk.java.net/jeps/358

Exception in thread "main" java.lang.NullPointerException: 
        Cannot read field "name" because "params.user" is null
    at Test.main(Test.java:3)

如上所示,会给出详细的发生空指针异常变量路径。

另外,如果是下标式访问的赋值语句,如 a[i][j][k] = 2020; 抛出空指针,那会是这样的:

Exception in thread "main" java.lang.NullPointerException:
        Cannot load from object array because "a[i][j]" is null
    at Test.main(Test.java:18)

注意:在同一行上显示异常类型、异常消息会导致行很长,所以为了保持可读性,会在第二行显示详细异常信息。


另外,这个功能在 Java 14 默认情况下是不开启的,可以使用以下 JVM 参数进行切换:


开启:-XX:+ShowCodeDetailsInExceptionMessages


关闭:-XX:-ShowCodeDetailsInExceptionMessages


为什么现在默认不开启?


1)性能


如果应用程序频繁地抛出并打印异常堆栈消息,势必会带来一定的开销、影响性能,所以应尽量避免这种开销。


2)安全


这个会导致更多源代码的暴露,如果这个不能接受,则不应由 JVM 配置应用程序打印,而应捕获并丢弃。


3)兼容性


过去的 JDK 都是不打印详细空指针异常信息的,JVM 相关工具要依赖于异常消息的准确格式,有可能会存在兼容性问题。


所以,这个特性暂时默认是关闭的,在未来不久的版本中会默认开启。


相关文章
|
7月前
|
存储 Oracle Java
Java11--ZGC--权衡--ZGC--GC术语--着色指针--多重映射--读屏障标记--重定位
Java11--ZGC--权衡--ZGC--GC术语--着色指针--多重映射--读屏障标记--重定位
136 0
java.lang.NullPointerExceptionMybatisPlus出现,测试,java.lang.NullPointe,空指针异常,public方法少写了一个字段,没加注解
java.lang.NullPointerExceptionMybatisPlus出现,测试,java.lang.NullPointe,空指针异常,public方法少写了一个字段,没加注解
|
6月前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
49 3
|
5月前
|
缓存 Java 数据库连接
Java演进问题之指针的间接获取现在对性能的影响变得更大如何解决
Java演进问题之指针的间接获取现在对性能的影响变得更大如何解决
|
7月前
|
存储 Java 开发者
探索Java开发中触发空指针异常的场景
作为一名后端开发者在Java编程的世界中,想必大家对空指针并不陌生,空指针异常是一种常见而又令人头疼的问题,它可能会在我们最不经意的时候突然出现,给我们的代码带来困扰,甚至导致系统的不稳定性,而且最可怕的是有时候不能及时定位到它的具体位置。针对这个问题,我们需要深入了解触发空指针异常的代码场景,并寻找有效的方法来识别和处理这些异常情况,而且我觉得空指针异常是每个Java开发者都可能面临的挑战,但只要我们深入了解它的触发场景,并采取适当的预防和处理措施,我们就能够更好地应对这个问题。那么本文就来分享一下实际开发中一些常见的触发空指针异常的代码场景,并分享如何有效地识别和处理这些异常情况。
108 1
探索Java开发中触发空指针异常的场景
|
7月前
|
安全 Java
Java为什么不让用指针?
总之,Java的设计目标之一是提供一个安全、稳定和易于开发的平台,通过禁止直接使用指针来实现这些目标。虽然指针可以提供更大的灵活性,但也带来了许多潜在的问题和安全风险。因此,Java采用了更高级的内存管理和安全性机制,以减少这些问题的发生。
78 1
|
7月前
|
Java
Java String 避免空指针的方法
Java String 避免空指针的方法
58 0
|
7月前
|
Rust 索引
Rust 编程小技巧摘选(6)
Rust 编程小技巧摘选(6)
87 1
Rust 编程小技巧摘选(6)
|
7月前
|
安全 IDE Java
终结空指针异常:Java开发者的生存指南
终结空指针异常:Java开发者的生存指南
185 1
|
7月前
|
安全 IDE Java
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
90 1
下一篇
DataWorks