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

相关文章

  • JPA之QueryDSL-JPA使用指南

    JPA之QueryDSL-JPA使用指南

    Springdata-JPA是对JPA使用的封装,Querydsl-JPA也是基于各种ORM之上的一个通用查询框架,使用它的API类库可以写出Java代码的sql,下面就来介绍一下JPA之QueryDSL-JPA使用指南
    2023-11-11
  • java多线程之Balking模式介绍

    java多线程之Balking模式介绍

    大家好,本篇文章主要讲的是java多线程之Balking模式介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Java的ConcurrentHashMap原理深入分析

    Java的ConcurrentHashMap原理深入分析

    这篇文章主要介绍了Java的ConcurrentHashMap原理深入分析,集合是编程中最常用的数据结构,而谈到并发,几乎总是离不开集合这类高级数据结构的支持,需要的朋友可以参考下
    2023-07-07
  • 手把手教你用SpringBoot将文件打包成zip存放或导出

    手把手教你用SpringBoot将文件打包成zip存放或导出

    相信各位看官在工作中都会遇到过要把多个文件打包成一个压缩文件然后导出,或者将文件打包成Zip存放,这就来上代码,废话不多说,需要的朋友可以参考下
    2021-06-06
  • springboot yml中profiles的巧妙用法(小白必看多环境配置)

    springboot yml中profiles的巧妙用法(小白必看多环境配置)

    这篇文章主要介绍了springboot yml中profiles的巧妙用法,非常适合多环境配置场景,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 关于JwtToken使用-重点看一下过期时间

    关于JwtToken使用-重点看一下过期时间

    这篇文章主要介绍了关于JwtToken使用-重点看一下过期时间,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Spring中的@PostConstruct注解使用详解

    Spring中的@PostConstruct注解使用详解

    这篇文章主要介绍了Spring中的@PostConstruct注解使用详解,该注解被用来修饰一个非静态的void方法,被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次,需要的朋友可以参考下
    2023-10-10
  • Spring IOC (DI) 依赖注入的四种方式示例详解

    Spring IOC (DI) 依赖注入的四种方式示例详解

    这篇文章主要介绍了Spring IOC (DI) 依赖注入的四种方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 计算一个Java对象占用字节数的方法

    计算一个Java对象占用字节数的方法

    这篇文章主要介绍了计算一个Java对象占用字节数的方法,较为详细的分析了Java中各类对象所占用的字节数,需要的朋友可以参考下
    2015-01-01
  • SpringBoot Redis缓存数据实现解析

    SpringBoot Redis缓存数据实现解析

    这篇文章主要介绍了SpringBoot Redis缓存数据实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01

最新评论