点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

作者 | liululi

来源 | 公众号「锅外的大佬」

在Java语言中,处理空指针往往是一件很头疼的事情,一不小心,说不定就搞出个线上Bug,让你的绩效考核拿到3.25。最近新出的Java14,相信大家都有所耳闻,那么今天就来看看,面对NullPointerException,Java14有哪些更好的处理方式呢?

1.传统的 NullPointerException

我们编码过程中呢,经常会使用链式调用的方式来写代码,这样写起来很方便,也很清晰,但是,一旦出现NullPointerException,那就头大了,因为你很难知道异常是在什么时候开始发生的。举个简单的例子,就比如下面的代码,要找到公司某个员工的户籍所在地,我们这样来调用

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

在链式调用的过程中,如果employeegetDetailInfos(),或者 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 of
"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$DetailInfos.getRegistryAddress()" is nullat 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 "<local1>" is null

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

关于NullPointerException的处理到这里就结束了,通过Java14增强的NullPointerException,我们可以很快速的定位代码问题的原因所在,更快的调试代码,节约时间,提高效率。

已经安装了Java14的朋友可以试试看哦~

往期推荐

深度学习手势识别带你玩转神庙逃亡

推荐 5 款好用的开源 Docker 工具

2020年最新Java面试题免费下载!

如何画出优秀的架构图?

详解 Spring Boot 中操作 ElasticSearch

推荐关注

专注分享最新技术

Java 14 :NullPointerException的处理新方式相关推荐

  1. 你好,了解一下Java 14带来的一系列新功能

    Java 14带来的一系列新功能 Java 14包含比前两个发行版更多的新功能-其中大多数旨在简化编码. 劳尔·加布里埃尔·乌尔玛(Raoul-Gabriel Urma) 下载本文的PDF Java ...

  2. NullPointerException 的处理新方式,Java14 真的太香了!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:锅外的大佬 1.传统的 NullPointerExcepti ...

  3. NullPointerException的处理新方式,Java14真的太香了

    在Java语言中,处理空指针往往是一件很头疼的事情,一不小心,说不定就搞出个线上Bug,让你的绩效考核拿到3.25.最近新出的Java14,相信大家都有所耳闻,那么今天就来看看,面对NullPoint ...

  4. Java 14 可能带来什么新特性?

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | oschina 来源 | 公众号「开源中国」 JDK/Java 13 在一个月前已 ...

  5. JDK/Java 14 可能带来什么新特性?

    JDK/Java 13 在一个月前已经发布,该版本带来了 5 大新特性,笔者观察到其中的 Text Blocks(文本块)特性似乎被讨论最多.文本块特性与常见的 Python "" ...

  6. Java 14的新功能

    2020年3月17日,Oracle发布了名为Java 14的Java新版本,其中包括许多新功能,工具,安全性,调试和更新的文档方面的改进. 但是,Oracle还向您提供Java的较旧版本,因为它具有向 ...

  7. 七、Java 14 新特性

    七.Java 14 新特性 Java 14 已如期于 2020 年 3 月 17 日正式发布,此次更新是继半年前 Java 13 这大版本发布之后的又一次常规版本更新,即便在全球疫情如此严峻形势下,依 ...

  8. Java 14:有用的NullPointerException消息

    Java 14中引入了新的JVM选项-XX:+ShowCodeDetailsInExceptionMessages ,以提供有用的NullPointerException消息 ,以准确显示在发生Nul ...

  9. Java 14 中令人期待的五大新特性!

    随着新的 Java 发布生命周期的到来,新版本预计将于 2020 年 3 月发布,本文将对其中的 5 个主要特性作些概述. 作者 | Sylvain Saurel 译者 | 苏本如,责编 | 郭芮 出 ...

最新文章

  1. 如何挂载initrd.img文件(简单三步)
  2. tomcat7+nginx+memcached 配置tomcat 集群以及负载均衡
  3. 反应速度测试软件,用批处理实现的反应速度测试工具
  4. 计算机科学基础内容摘抄,科学网-上计算机课,不接触计算机----日记摘抄(161)-武夷山的博文...
  5. python虚拟环境解决不能执行脚本的问题
  6. HTML5 桌面通知:Notification API
  7. java io 读取配置文件_(转)Java 读写Properties配置文件
  8. 【制表符\t】你不知道的制表符\t的那些事儿~
  9. 数论入门(python)
  10. 通信基础 8 —— MIMO / 3GPP / UMI
  11. Xshell上传文件到Ubuntu服务器
  12. 项目管理体验营day3:项目管理之沟通技巧
  13. 【目标检测】|数据增强 Copy-Paste
  14. 规则三度体磁力异常 matlab,三维强磁性体的勘探方法及勘探系统与流程
  15. mysql navicat视图_Navicat 教程:MySQL 视图
  16. python学习笔记:类的方法总结
  17. js判断是否为电话号码
  18. 信捷伺服刚性调整_信捷伺服常见问题分析解答.pdf
  19. 今天心情好,给各位免费呈上200兆SVN代码服务器一枚,不谢!
  20. 技术博客哪家强:CSDN、博客园、简书、开源中国OSChina等博客的详细分析比较

热门文章

  1. linux c 线程同步的三种方法
  2. linux shell mv/cp 错误: will not overwrite just-created <filename> with <sameFilename> 解决方法
  3. php 反序列化工具 phpggc 简介
  4. python 找不到ssl模块问题 no module named _ssl
  5. 解读比特币白皮书:点对点电子现金系统
  6. linux c openssl rsa 加解密
  7. php-fpm添加service服务
  8. 对C语言中递归算法的分析
  9. upgrade mysql client_The mysql_upgrade client is now deprecated(mysql_upgrade客户机现在已经弃用)...
  10. 问题集锦(36-40)