0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java14处理NullPointerException新方式

jf_ro2CN3Fa 来源:锅外的大佬 作者:锅外的大佬 2022-10-11 17:56 次阅读

1.传统的 NullPointerException

2.增强型 NullPointerException

2.1 详细的异常信息

3. 技术方面

Java语言中,处理空指针往往是一件很头疼的事情,一不小心,说不定就搞出个线上Bug,让你的绩效考核拿到3.25。

最近新出的Java14,相信大家都有所耳闻,那么今天就来看看,面对NullPointerException,Java14有哪些更好的处理方式呢?

1.传统的 NullPointerException

我们编码过程中呢,经常会使用链式调用的方式来写代码,这样写起来很方便,也很清晰,但是,一旦出现NullPointerException,那就头大了,因为你很难知道异常是在什么时候开始发生的。

举个简单的例子,就比如下面的代码,要找到公司某个员工的户籍所在地,我们这样来调用

Stringcity=employee.getDetailInfos().getRegistryAddress().getCity();

在链式调用的过程中,如果employee, getDetailInfos(),或者 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 标志的情况下再次运行代码:

Exceptioninthread"main"java.lang.NullPointerException:Cannotinvoke"RegistryAddress.getCity()"becausethereturnvalueof "com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$DetailInfos.getRegistryAddress()"isnull atcom.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException.main(HelpfulNullPointerException.java:10)

这一次,从附加信息中,我们知道员工的个人详细信息丢失的注册地址导致了我们的异常。从这个增强中获得的信息可以节省我们调试所用的时间。

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

Cannotinvoke"String.toLowerCase()"becausethereturnvalueof"getEmailAddress()"isnull

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

3. 技术方面

现在我们已经很好地理解了如何使用增强的NullPointerExceptions标识 null 引用,让我们来看看它的一些技术方面。

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

其次,**JEP 358 ** 懒汉式地计算消息,这意味着只有当我们打印异常消息时才调用增强的NullPointerException,而不是当异常发生时就调用。因此,对于通常的JVM流程不应该有任何性能影响,在那里我们可以捕获并重新抛出异常,因为咱并不会只想打印异常消息。

最后,详细的异常消息可能包含源代码中的局部变量名。因此,我们可以认为这是一个潜在的安全风险。但是,只有在运行使用激活的 -g 标记编译的代码时,才会发生这种情况,该标记会生成调试信息并将其添加到类文件中。请考虑一个简单的示例,我们已编译该示例以包含以下附加调试信息:

Employeeemployee=null; employee.getName();

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

"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()" because"employee"isnull

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

Cannotinvoke "com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()" because"
        
         "isnull
        

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2934

    浏览量

    103850
  • 编程
    +关注

    关注

    88

    文章

    3497

    浏览量

    93108
  • 指针
    +关注

    关注

    1

    文章

    475

    浏览量

    70453
  • JVM
    JVM
    +关注

    关注

    0

    文章

    155

    浏览量

    12166

原文标题:Java14 处理 NullPointerException 新方式,真的太香了!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    串级PID为什么需要过零处理?如何进行过零处理

    串级PID为什么需要过零 处理?串级PID如何进行过零 处理?如何判断电机是否过机械零点?
    发表于06-30 06:48

    MSM8940处理器有哪些特点

    MSM8940 处理器是什么?MSM8940 处理器有哪些特点?
    发表于11-09 07:09

    STM32处理器的启动方式是什么?

    STM32 处理器的启动 方式是什么?
    发表于11-29 07:48

    RK3399处理器与AR9201处理器有哪些不同之处呢

    RK3399 处理器与AR9201 处理器有哪些不同之处呢?hi3559A 处理器与RV1126 处理器有哪些不同之处呢?
    发表于02-21 07:29

    Sitara AM62处理器的资料分享

    和小型人机界面 (HMI) 应用。TI 将于2022年6月21日至23日在德国纽伦堡的Embedded World展会(215号展位)上展出全新的AM62 处理器,并演示适用于边缘AI和电动汽车充电HMI
    发表于11-03 06:11

    Cortex-A9处理器技术参考手册

    Cortex-A9 处理器是一款高性能、低功耗的ARM宏单元,具有L1缓存子系统,可提供完整的虚拟内存功能。Cortex-A9 处理器实现ARMv7-A架构,在Jazelle®状态下运行32位ARM指令、16位和32位Thumb®指令以及8位
    发表于08-02 16:29

    Intel 64位处理器,Intel 64位处理器结构原理

    Intel 64位 处理器,Intel 64位 处理器结构原理 现在人们广泛使用的是由32位微 处理器构成的计算系统,但是32位的计算和操作系统不能支持
    发表于03-26 15:07 3234次阅读

    苹果a6处理器怎么样_a6处理器参数

    苹果正式发布iphone5,iphone5采用A6 处理器,那么A6 处理器怎么样?a6 处理器参数是什么呢?a6 处理器四核的吗?带着这些疑问,我们来一起了解下A6
    发表于09-13 14:29 2.6w次阅读

    A14处理器性能已超酷睿i9处理器,意味着ARM超越Intel吗?

    苹果最新发布的A 14 处理器性能比去年的A13提升了16%,而去年的A13 处理器已与Intel的顶级PC 处理器酷睿i9-10920X相当,如此一来A 1
    的头像 发表于10-21 10:48 7502次阅读
    A<b class='flag-5'>14</b><b class='flag-5'>处理</b>器性能已超酷睿i9<b class='flag-5'>处理</b>器,意味着ARM超越Intel吗?

    A14处理器的性能超过酷睿i9处理器,ARM胜出一筹

    苹果最新发布的A 14 处理器性能比去年的A13提升了16%,而去年的A13 处理器已与Intel的顶级PC 处理器酷睿i9-10920X相当,如此一来A 1
    发表于10-21 15:07 2711次阅读
    A<b class='flag-5'>14</b><b class='flag-5'>处理</b>器的性能超过酷睿i9<b class='flag-5'>处理</b>器,ARM胜出一筹

    麒麟9000处理器和高通骁龙875处理器相比如何?

    随着华为mate10系列的发布,华为最后一代旗舰 处理器,麒麟9000也就此亮相,大家对于麒麟9000 处理器十分的看好。因为麒麟9000 处理器在安兔兔的跑分竟然高达72万分,较上一代麒麟990
    的头像 发表于11-03 11:31 5726次阅读

    苹果a14处理器是几纳米_苹果a14处理器参数

    苹果A 14 处理器制程工艺为5纳米!而如今苹果再次从7纳米过渡到5纳米制程,在手机性能上再次处于领先地位。要知道,如今芯片制造商在不断缩小晶体管的规格,因此制造方面会变得越来越困难。
    的头像 发表于11-19 14:27 4.4w次阅读

    LTM4600处理

    LTM4600 处理
    发表于05-27 08:34 9次下载
    LTM4600<b class='flag-5'>处理</b>

    iPhone14搭载A15处理器亮相

    iPhone 14搭载A15 处理器亮相
    的头像 发表于09-08 01:55 1358次阅读
    iPhone<b class='flag-5'>14</b>搭载A15<b class='flag-5'>处理</b>器亮相

    NullPointerException及其产生的场景

    如果一个 Java程序到处抛出 NullPointerException,那么我们可能会各种吐槽代码的质量。但是我们的项目又经常会抛出空指针异常,空指针异常必然常伴 Java程序员。为此我们需要了解一些它
    的头像 发表于10-09 17:14 621次阅读