3月31日,有博主曝光一段疑似演员宋宁峰出轨“Q女士”的录音,多个相关词条登上热搜榜。 4月1日,宋宁峰发长文承认出轨。他表示,录音中的人确实是自己:...
2026-04-01 6
在Java语言中,处理空指针往往是一件很头疼的事情,一不小心,说不定就搞出个线上Bug,让你的绩效考核拿到3.25。
最近新出的Java14,相信大家都有所耳闻,那么今天就来看看,面对NullPointerException,Java14有哪些更好的处理方式呢?
传统的 NullPointerException
我们编码过程中呢,经常会使用链式调用的方式来写代码,这样写起来很方便,也很清晰,但是,一旦出现NullPointerException,那就头大了,因为你很难知道异常是在什么时候开始发生的。
举个简单的例子,就比如下面的代码,要找到公司某个员工的户籍所在地,我们这样来调用
在链式调用的过程中,如果 employee, getDetailInfos,或者 getRegistryAddress 为空,JVM就会抛出 NullPointerException
那么导致异常的根本原因是什么?如果不使用调试器,很难确定哪个变量为空。而且,JVM也只会打印导致异常的方法、文件名和行号,仅此而已。那么下面,我将带大家了解Java 14如何通过 JEP358 解决这个问题。
增强型 NullPointerException
SAP在2006年为其商业JVM实现了增强型的 NullPointerException。2019年2月,它被提议作为OpenJDK社区的一个增强,之后很快,它成为了一个JEP。所以,该功能在2019年10月完成并在JDK 14版本推出。
本质上,JEP 358 旨在通过描述某个变量是 “null” 来提高 JVM 生成的 “NullPointerException” 的可读性。JEP 358通过在方法、文件名和行号旁边描述为 null 的变量,带来了一个详细的 NullPointerException 消息。
它通过分析程序的字节码指令来工作。因此,它能够精确地确定哪个变量或表达式是null。最重要的是,JDK 14中默认关闭详细的异常消息。要启用它,我们需要使用命令行选项:
详细的异常信息
考虑在激活 ShowCodeDetailsInExceptionMessages 标志的情况下再次运行代码:
这一次,从附加信息中,我们知道员工的个人详细信息丢失的注册地址导致了我们的异常。从这个增强中获得的信息可以节省我们调试所用的时间。
JVM由两部分组成详细的异常消息。第一部分表示失败的操作,这是引用为 null 的结果,而第二部分标识了 null 引用的原因:
为了生成异常消息,JEP 358 重构了将空引用推送到操作数堆栈上的部分源代码。
技术方面
展开全文
现在我们已经很好地理解了如何使用增强的NullPointerExceptions标识 null 引用,让我们来看看它的一些技术方面。
首先,只有当JVM本身抛出一个 NullPointerException 时,才会进行详细的消息计算,如果我们在Java代码中显式抛出异常,则不会执行计算。原因时因为:在这些情况下,很可能已经在异常构造函数中传递了一条有意义的消息。
其次,*JEP 358 * 懒汉式地计算消息,这意味着只有当我们打印异常消息时才调用增强的NullPointerException,而不是当异常发生时就调用。因此,对于通常的JVM流程不应该有任何性能影响,在那里我们可以捕获并重新抛出异常,因为咱并不会只想打印异常消息。
最后,详细的异常消息可能包含源代码中的局部变量名。因此,我们可以认为这是一个潜在的安全风险。但是,只有在运行使用激活的 -g 标记编译的代码时,才会发生这种情况,该标记会生成调试信息并将其添加到类文件中。请考虑一个简单的示例,我们已编译该示例以包含以下附加调试信息:
当执行以上代码时,异常信息中会打印本地变量名称:
相反,在没有额外调试信息的情况下,JVM 只提供它在详细消息中所知道的变量:
JVM 打印编译器分配的变量索引,而不是本地变量名(employee)。
关于NullPointerException的处理到这里就结束了,通过Java14增强的NullPointerException,我们可以很快速的定位代码问题的原因所在,更快的调试代码,节约时间,提高效率。
已经安装了Java14的朋友可以试试看哦~
JAVA技术
mp.weixin.qq.com/s/KMzEmMqoIjqaYCYzoEkBNw
相关文章
3月31日,有博主曝光一段疑似演员宋宁峰出轨“Q女士”的录音,多个相关词条登上热搜榜。 4月1日,宋宁峰发长文承认出轨。他表示,录音中的人确实是自己:...
2026-04-01 6
日本的外交政策正在面临前所未有的考验。两位“邻居”——俄罗斯和中国,似乎达成了一种默契,齐齐对日本发起了攻势,令本就岌岌可危的日本在短时间内倍感压力。...
2026-04-01 4
自从美国和以色列联合对伊朗展开军事行动并成功击毙前最高领袖阿里・哈梅内伊以来,伊朗政权的稳定性面临严峻考验。在这样的背景下,新的最高领袖穆杰塔巴・哈梅...
2026-04-01 4
【文/观察者网 陈思佳】过去几个月,在美国的调解下,俄罗斯和乌克兰已举行多轮谈判,但始终没有取得进展。据俄罗斯塔斯社3月29日报道,俄罗斯总统助理乌沙...
2026-03-30 6
齐鲁晚报·齐鲁壹点 高雅洁 3月27日,青岛市举行“清风寄思 沧海为念”2026年海上追思暨殡仪馆开放日活动,100名海葬逝者家属出海参与海上追思。据...
2026-03-27 4
歼20战斗机 本文综合财新、光明网、中国网、澎湃新闻、上观新闻等 又有军工集团原高管在两院院士名单中“消失”。 近日,有媒体发现,中国科学院官网已经低...
2026-03-27 5
北京时间3月27日消息,2026国际足联系列赛展开争夺,中国男足在悉尼澳大利亚体育场迎战库拉索。上半场比赛场面略显沉闷,韦世豪补时阶段打破僵局,下半场...
2026-03-27 4
3月26日,有网友发布消息称广西脾胃病领域大师黄贵华教授因心梗去世,其社交账号头像已变灰。3月27日,广西中医药大学第一附属医院工作人员向记者证实,消...
2026-03-27 3
发表评论