点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

来源:锅外的大佬

  • 1.传统的 NullPointerException

  • 2.增强型 NullPointerException

    • 2.1 详细的异常信息

  • 3. 技术方面


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

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

1.传统的 NullPointerException

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

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

String city = 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 标志的情况下再次运行代码:

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的朋友可以试试看哦~

热门内容:面试官:我把数据库部署在Docker容器内,你觉得如何?
炫酷,SpringBoot+Echarts实现用户访问地图可视化(附源码)API 面试四连杀:接口如何设计?安全如何保证?签名如何实现?防重如何实现
为什么 SQL 语句不要过多的 join?最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

NullPointerException 的处理新方式,Java14 真的太香了!相关推荐

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

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

  2. Java 14 :NullPointerException的处理新方式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | liululi 来源 | 公众号「锅外的大佬」 ...

  3. 从阿里跳槽来的工程师,分享了三套干掉 “重复代码”方式,真的太绝了!

     附:糖豆广场舞永久会员TV版 软件工程师和码农最大的区别就是平时写代码时习惯问题,码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码. 业务同学抱怨业务开发没有技术含量,用不到设计模 ...

  4. java语言的主要特点是什么,真的太香了!

    拼多多二面:多线程+乐观锁和悲观锁+并发. 一面 1.并发编程三要素? 2.实现可见性的方法有哪些? 3.多线程的价值? 4.创建线程的有哪些方式? 5.创建线程的三种方式的对比? 6.什么是线程池? ...

  5. 如此优秀,这18个 Python 高效编程技巧真的太香了

    初识 Python 语言,觉得 Python 满足了我上学时候对编程语言的所有要求.python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行的,终于解脱了. 高级语 ...

  6. javaweb面试问题大全及答案大全,真的太香了!

    整理的70道阿里的Java面试题,都来挑战一下,看看自己有多厉害. 1.java事件机制包括哪三个部分?分别介绍. 2.为什么要使用线程池? 3.线程池有什么作用? 4.说说几种常见的线程池及使用场景 ...

  7. 干货来袭!初步理解类加载运行机制和类加载过程,真的太香了!

    开头 被面试人是我的一位粉丝近期刚刚结束了蚂蚁金服的三轮技术面试,面完之后他跟我说很累,直言不想再体验了. 他的面试经历我仔细看了看,一面重点在基础知识的考查,二面重点在项目以及对框架的使用与理解上, ...

  8. javaweb项目完整案例下载,真的太香了!

    前言 今天这篇文章是比较偏"教程"一点的文章.但也由浅入深,认真地分析了源码,并且介绍了一些在使用Spring Cache中常见的问题和解决方案,肯定是比简单的入门文档更有深度一些 ...

  9. GitHub标星75k,阿里15W字的Spring高级文档(全彩版),真的太香了

    随着 Spring 使用越来越广泛,Spring 已经成为 Java 程序员面试的必问知识点,很多同学对于Spring理解不是那么的深刻,经常就会被几个连环追问给干趴了! 今天小编整理了一下一线架构师 ...

最新文章

  1. 计算机视觉进展二十年 (1995~2015)
  2. prometheus监控_使用Prometheus和Grafana监视开放自由
  3. 创新实训团队记录:为BR-MTC问题设计一个近似算法
  4. Linux分支代码必须公开吗,linux – 当拉出不同的分支时,让“git pull”请求确认...
  5. Loadrunner基础:Loadrunner Vuser基本概念和应用
  6. Lync Server 2010迁移至Lync Server 2013故障排错 Part3 :内外网共享PPT提示证书问
  7. PHP7内核基础知识之变量类型
  8. Win7点击文件夹右键可打开cmd控制台,并获取当前目录
  9. Cmake入门(1)cmake安装,创建第一个工程,引入头文件
  10. 知识蒸馏(Knowledge Distillation)
  11. 最让IT技术支持人员头痛的10件事
  12. 工作中常用的英文单词缩写
  13. 按键精灵通过句柄获取窗口坐标_按键精灵怎么获取同名窗口的句柄
  14. 使用pycharm去掉表格中的重复数据
  15. unity全局总的音频管理器
  16. 年薪170W阿里P8相亲要求女方月薪1万,网友:有点高
  17. 【Python】根据多个列同时进行多条件筛选数据
  18. Legacy Code Tool
  19. 笔试编程题 拼凑正方形 Java题解 牛牛有4根木棍,长度分别为a,b,c,d。羊羊家提供改变木棍长度的服务,如果牛牛支付一个硬币就可以让一根木棍的长度加一或者减一。牛牛需要用这四根木棍拼凑一个正方
  20. PHP微信扫描登陆(模拟微信企业号平台登陆)

热门文章

  1. 分治策略解决幂乘问题
  2. 文本处理工具之grep和egrep
  3. [动态dp]线段树维护转移矩阵
  4. 剑指Offer——平衡二叉树
  5. 企业的覆灭,我监视你的Exchange邮件!
  6. 【青少年编程】【三级】海底寻宝
  7. 刻意练习:LeetCode实战 -- Task26.判断子序列
  8. 刻意练习:LeetCode实战 -- Task10. 两数相加
  9. Strategy_Pattern
  10. mysql data ibdata1_database - 如何在MySQL中收缩/清除ibdata1文件