Java14对于NullPointerException的新处理方式示例解析

 更新时间:2023年09月12日 10:59:53   作者:Java后端技术  
这篇文章主要为大家介绍了Java14对于NullPointerException的新处理方式示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

最近新出的Java14,相信大家有所耳闻,面对NullPointerException,Java14有哪些更好的处理方式呢?

1、传统的NullPointerException

在编码过程中,经常会用到链式的调用方式来写代码,方便清晰,但是一旦出现NullPointerException,就头大了。因为很难知道异常在什么时候发生。举个例子:

String city = employe.getDetailInfo().getAddress().getCity();

在链式调用过程中,如果 employeegetDetailInfo(),或者getAddress()为空,JVM就会抛出NullPointerExeption,那么导致异常的根本原因是什么?如果不使用调试器,我们很难确认哪个变量为空。而JVM也只会打印导致异常的方法、文件名和行号。

2、增强型 NullPointerException

SAP在2006年为商业JVM实现了增强型的NullPointerException。2019年,被提议作为一个OpenJDK社区的增强。本质上JEP 358通过描述某个变量是"null"来提高JVM生成"NullPointerException"的可读性。通过在方法、文件名和行号旁边描述为null的变量,带来一个详细的NullPointerException消息。通过分析程序的字节码指令来工作,因此能够准确的定位到哪个变量或者表达式为null。

在Java14中,默认是关闭详细的异常消息的。

要启用,需要配置:

-xx:+showCodeDeatilsInExceptionMessages

2.1 详细的异常信息考虑在激活showCodeDeatilsInExceptionMessages标志的情况下再次运行代码,从附加信息中,可以看到具体的空指针的类,来节省我们调试所用的时间。

JVM有两部分组成详细的异常信息,第一部分表示失败的操作,是引用为null的结果,第二部分标识了null引用的原因

Cannot invoke "String.toLowerCase()" because the return value of "getEmailAddress()" is null

为了生成异常信息,JEP 358重构了将空引用推送到操作数堆栈上的部分源码。

3 技术方面

只有当JVM本身抛出"NullPointerException"时,才会进行详细的消息计划,如果我们在代码中显示抛出异常,则不会执行计算。原因:在这些情况下,很可能已经在异常构造函数中传递了一条有意义的消息。

其次,JEP 358懒汉式的计算消息,这意味着只有当我们打印异常消息的时候,才调用增强的NullPointerException,而不是当异常发生时就调用。因此对于通常的JVM流程不应该有任何性能影响。

最后,详细的异常信息可能包含源代码中的局部变量名。因此我们认为这是一个潜在的安全风险。但是只有运行使用激活的-G标记编译的代码时,才会发生这样的情况。

Employee employee = null;
employee.getName();

执行以上代码时,异常信息中会打印本地变量名称:

"com.xxx.xxx.xxx$Employee.getName()"
because "employee" is null

相反,没有额外调试信息的情况下,JVM只提供他在详细信息中所知道的变量

Cannot invoke
 "com.xxx.xxx.xxx$Employee.getName()"
because "<locall>" is null

JVM打印编译器分配的变量索引,而不是本地变量名(employee)

通过Java14增强型的NullPointerException,我们可以很快定位出代码问题所在,更快的调试代码,提高效率。

以上就是Java14对于NullPointerException的新处理方式示例解析的详细内容,更多关于Java NullPointerException的资料请关注脚本之家其它相关文章!

相关文章

  • idea配置tomcat,idea配置web下lib的包详解

    idea配置tomcat,idea配置web下lib的包详解

    这篇文章主要介绍了idea配置tomcat,idea配置web下lib的包,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • MybatisPlus将自定义的sql列表查询返回改为分页查询

    MybatisPlus将自定义的sql列表查询返回改为分页查询

    本文主要介绍了MybatisPlus将自定义的sql列表查询返回改为分页查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • java简单工厂模式入门

    java简单工厂模式入门

    下面小编就为大家带来一篇java工厂模式入门文章。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-07-07
  • Java中的Timer与TimerTask源码及使用解析

    Java中的Timer与TimerTask源码及使用解析

    这篇文章主要介绍了Java中的Timer与TimerTask源码及使用解析,在Java中,经常使用Timer来定时调度任务,Timer调度任务有一次性调度和循环调度,循环调度有分为固定速率调度(fixRate)和固定时延调度(fixDelay),需要的朋友可以参考下
    2023-10-10
  • SpringBoot使用POI进行Excel下载

    SpringBoot使用POI进行Excel下载

    这篇文章主要为大家详细介绍了SpringBoot使用POI进行Excel下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • mybatis项目兼容mybatis-plus问题

    mybatis项目兼容mybatis-plus问题

    这篇文章主要介绍了mybatis项目兼容mybatis-plus问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Java选择结构与循环结构的使用详解

    Java选择结构与循环结构的使用详解

    循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环,选择结构用于判断给定的条件,根据判断的结果判断某些条件,根据判断的结果来控制程序的流程
    2022-03-03
  • spring基础系列之JavaConfig配置详解

    spring基础系列之JavaConfig配置详解

    本篇文章主要介绍了spring基础系列之JavaConfig配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Maven仓库的具体使用(本地仓库+远程仓库)

    Maven仓库的具体使用(本地仓库+远程仓库)

    Maven 在某个统一的位置存储所有项目的构件,这个统一的位置,我们就称之为仓库,本文主要介绍了Maven仓库的具体使用(本地仓库+远程仓库),感兴趣的可以了解一下
    2023-11-11
  • java实现Api接口加密通信方式

    java实现Api接口加密通信方式

    这篇文章主要介绍了java实现Api接口加密通信方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论