Java14处理NullPointerException新方式

1.传统的 nullpointerexception
2.增强型 nullpointerexception
2.1 详细的异常信息
3. 技术方面
在java语言中,处理空指针往往是一件很头疼的事情,一不小心,说不定就搞出个线上bug,让你的绩效考核拿到3.25。
最近新出的java14,相信大家都有所耳闻,那么今天就来看看,面对nullpointerexception,java14有哪些更好的处理方式呢?
1.传统的 nullpointerexception
我们编码过程中呢,经常会使用链式调用的方式来写代码,这样写起来很方便,也很清晰,但是,一旦出现nullpointerexception,那就头大了,因为你很难知道异常是在什么时候开始发生的。
举个简单的例子,就比如下面的代码,要找到公司某个员工的户籍所在地,我们这样来调用
string city = employee.getdetailinfos().getregistryaddress().getcity();  
在链式调用的过程中,如果employee, getdetailinfos(),或者 getregistryaddress() 为空,jvm就会抛出 nullpointerexception
那么导致异常的根本原因是什么?如果不使用调试器,很难确定哪个变量为空。而且,jvm也只会打印导致异常的方法、文件名和行号,仅此而已。那么下面,我将带大家了解java 14如何通过 jep 358 解决这个问题。
2.增强型 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中默认关闭详细的异常消息 。要启用它,我们需要使用命令行选项:
-xx:+showcodedetailsinexceptionmessages  
2.1 详细的异常信息
考虑在激活 showcodedetailsinexceptionmessages 标志的情况下再次运行代码:
exception in thread main java.lang.nullpointerexception:  cannot invoke registryaddress.getcity() because the return value ofcom.developlee.java14.helpfulnullpointerexceptions.helpfulnullpointerexception$detailinfos.getregistryaddress() is null  at com.developlee.java14.helpfulnullpointerexceptions.helpfulnullpointerexception.main(helpfulnullpointerexception.java:10)  
这一次,从附加信息中,我们知道员工的个人详细信息丢失的注册地址导致了我们的异常。从这个增强中获得的信息可以节省我们调试所用的时间。
jvm由两部分组成详细的异常消息。第一部分表示失败的操作,这是引用为 *null* 的结果,而第二部分标识了 *null* 引用 的原因:
cannot invoke string.tolowercase() because the return value of getemailaddress() is null  
为了生成异常消息,jep 358 重构了将空引用推送到操作数堆栈上的部分源代码。
3. 技术方面
现在我们已经很好地理解了如何使用增强的nullpointerexceptions标识 null 引用,让我们来看看它的一些技术方面。
首先,只有当jvm本身抛出一个 nullpointerexception 时,才会进行详细的消息计算,如果我们在java代码中显式抛出异常,则不会执行计算。原因是因为:在这些情况下,很可能已经在异常构造函数中传递了一条有意义的消息。
其次,**jep 358 ** 懒汉式地计算消息,这意味着只有当我们打印异常消息时才调用增强的nullpointerexception,而不是当异常发生时就调用。因此,对于通常的jvm流程不应该有任何性能影响,在那里我们可以捕获并重新抛出异常,因为咱并不会只想打印异常消息。
最后,详细的异常消息可能包含源代码 中的局部变量名。因此,我们可以认为这是一个潜在的安全风险。但是,只有在运行使用激活的 -g 标记编译的代码时,才会发生这种情况,该标记会生成调试信息并将其添加到类文件中。请考虑一个简单的示例,我们已编译该示例以包含以下附加调试信息:
employee employee = null;employee.getname();  
当执行以上代码时,异常信息中会打印本地变量名称:
com.developlee.java14.helpfulnullpointerexceptions.helpfulnullpointerexception$employee.getname()because employee is null  
相反,在没有额外调试信息的情况下,jvm 只提供它在详细消息中所知道的变量:
cannot invoke  com.developlee.java14.helpfulnullpointerexceptions.helpfulnullpointerexception$employee.getname()because  is null  
jvm 打印编译器分配的变量索引,而不是本地变量名(employee)。
关于nullpointerexception的处理到这里就结束了,通过java14增强的nullpointerexception,我们可以很快速的定位代码问题的原因所在,更快的调试代码,节约时间,提高效率。
已经安装了java14的朋友可以试试看哦~

移动处理器性能大战:高通、华为等谁能称霸?
测土配肥施肥仪器的特点是什么
市场情绪会怎样影响比特币的市场
Redmi K30系列将于12月10日发布搭载了天玑1000芯片
电机是怎么转起来的?
Java14处理NullPointerException新方式
笔记本电脑真的需要触控板和触摸屏吗
安捷伦N4010A蓝牙测试仪
做电子产品遇到的准度、精度概念介绍
华为MatePad功能正式敲定,手写笔加持+多屏协同
骁龙835和a10谁强谁弱_高通骁龙835和苹果a10对比
一种新的基于电穿孔的皮肤高效核酸递送方法
AI赋予公共交通更多可能
人工智能时代的预测之术可以干嘛
音频蓝牙语音芯片,WT2605C-32N实时录音上传技术方案介绍
微信小程序现“逆流” 连接线下需要耐心
探析下一代半导体材料在改造照明技术方面的潜力
如何制作一款蓄电池自动充电控制器?
华为Mate10什么时候上市?华为Mate10最新消息:华为Mate10或配备4Dtouch技术,配置性能双摄升级
动力电池发展方案出台 三元电池技术空间大