在Java词汇中,处置空操作符常常是两件很郁闷的事情,白白,没准就搞出个线上Bug,让你的考核领到3.25。前段时间Chavanges的Java14,坚信我们都有所听闻,所以今天就来看看,直面NullPointerException,Java14有甚么样更快的处置形式呢?

他们代码操作过程中呢,时常会采用拉艾初始化的形式来写标识符,这种写起来很方便快捷,也很明晰,但是,除非出现NullPointerException,那就头大了,因为你极难知道极度是在甚么时候开始发生的。举个单纯的范例,就比如说上面的标识符,要找出公司某一雇员的户口所在,他们这种来初始化

String city = employee.getDetailInfos().getRegistryAddress().getCity();

在拉艾初始化的操作过程中,假如 employee, getDetailInfos(),或者 getRegistryAddress() 为空,JVM就会放出 NullPointerException,

所以引致极度的根源是甚么?假如不采用软件程序,极难确认别的函数为空。而且,JVM也只会列印引致极度的形式、配置文件和公家机关,Chavanges。所以上面,我将带我们了解Java 14如何透过 JEP358 解决这个问题。复试秘籍:www.yoodb.com

SAP在2006年为其商业性JVM实现了XT736PA的 NullPointerException。2019年2月,它被一致同意作为OpenJDK街道社区的两个进一步增强,之后迅速,它成为了两个JEP。所以,该机能在2019年10月完成并在JDK 14版面世。其本质上,JEP 358 意在透过叙述某一函数是 null 来提高 JVM 聚合的 NullPointerException 的时效性。JEP 358透过在形式、配置文件和公家机关旁叙述为 null 的函数,带来了两个详尽的 NullPointerException 最新消息。它透过involves的二进制码命令来工作。因此,它能够准确地确认别的函数或函数是null。最重要的是,JDK 14中预设停用详尽的极度最新消息。要投入使用它,他们需要采用配置文件快捷键:

-XX: ShowCodeDetailsInExceptionMessages

2.1 详尽的极度信息

考虑在转化成 ShowCodeDetailsInExceptionMessages 象征的情况下再次运转标识符:

Exceptionin thread “main” java.lang.NullPointerException:

Cannot invoke “RegistryAddress.getCity()” because the return value of

“com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$DetailInfos.getRegistryAddress()”isnull

at com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException.main(HelpfulNullPointerException.java:10

这一次,从附加信息中,他们知道雇员的个人详尽信息丢失的注册地址引致了他们的极度。从这个进一步增强中获得的信息可以节省他们调试所用的时间。复试秘籍:www.yoodb.com

JVM由两部分组成详尽的极度最新消息。第一部分表示失败的操作,这是引用为 null 的结果,而第二部分标识了 null 引用的原因:

Cannot invoke “String.toLowerCase()” because the return value of “getEmailAddress()”isnull

为了聚合极度最新消息,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”isnull

相反,在没有额外调试信息的情况下,JVM 只提供它在详尽最新消息中所知道的函数:

Cannot invoke

“com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()”

because “”isnull

JVM 列印编译器分配的函数索引,而不是本地函数名(employee)。

关于NullPointerException的处置到这里就结束了,透过Java14进一步增强的NullPointerException,他们可以迅速速的定位标识符问题的原因所在,更快的调试标识符,节约时间,提高效率。

作者:HUWD https://blog.csdn.net/weixin_45089791/article/details/116921075/

公众号Java精选所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处置!

前段时间有很多人问,有没有读者交流群!加入形式很单纯,公众号Java精选,回复加群,即可入群!

(微信小程序):3000 道复试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

1.本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!