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的资料请关注脚本之家其它相关文章!

相关文章

  • JAVA springboot如何开启俩端口

    JAVA springboot如何开启俩端口

    这篇文章主要介绍了JAVA springboot如何开启俩端口问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Spring获取管理对象常用方法详解

    Spring获取管理对象常用方法详解

    这篇文章主要介绍了Spring获取管理对象常用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 详解MyBatis自定义Plugin插件

    详解MyBatis自定义Plugin插件

    这篇文章主要介绍了MyBatis自定义Plugin插件的相关知识,实现方法也很简单,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可,需要的朋友可以参考下
    2018-06-06
  • 使用Spring从YAML文件读取内容映射为Map方式

    使用Spring从YAML文件读取内容映射为Map方式

    这篇文章主要介绍了使用Spring从YAML文件读取内容映射为Map方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Spring Boot 集成Redisson实现分布式锁详细案例

    Spring Boot 集成Redisson实现分布式锁详细案例

    这篇文章主要介绍了Spring Boot 集成Redisson实现分布式锁详细案例,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • springboot自定义异常视图过程解析

    springboot自定义异常视图过程解析

    这篇文章主要介绍了springboot自定义异常视图过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Spring Boot配置读取实现方法解析

    Spring Boot配置读取实现方法解析

    这篇文章主要介绍了Spring Boot配置读取实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 浅谈maven的jar包和war包区别 以及打包方法

    浅谈maven的jar包和war包区别 以及打包方法

    下面小编就为大家分享一篇浅谈maven的jar包和war包区别 以及打包方法,具有很好的参考价值,希望对大家有所帮助
    2017-11-11
  • GraalVM和Spring Native尝鲜一步步让Springboot启动飞起来66ms完成启动

    GraalVM和Spring Native尝鲜一步步让Springboot启动飞起来66ms完成启动

    GraalVM是高性能的JDK,支持Java/Python/JavaScript等语言,它可以让Java变成二进制文件来执行,让程序在任何地方运行更快,这篇文章主要介绍了GraalVM和Spring Native尝鲜一步步让Springboot启动飞起来66ms完成启动,需要的朋友可以参考下
    2023-02-02
  • SpringBoot中Bean生命周期自定义初始化和销毁方法详解

    SpringBoot中Bean生命周期自定义初始化和销毁方法详解

    这篇文章给大家详细介绍了SpringBoot中Bean生命周期自定义初始化和销毁方法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01

最新评论