网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

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

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


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


在链式调用的过程中,如果 employee, getDetailInfos(),或者 getRegistryAddress() 为空,JVM就会抛出 NullPointerException,

那么导致异常的根本原因是什么?如果不使用调试器,很难确定哪个变量为空。而且,JVM也只会打印导致异常的方法、文件名和行号,仅此而已。那么下面,我将带大家了解Java 14如何通过 JEP358 解决这个问题。面试宝典:www.yoodb.com

SAP在2006年为其商业JVM实现了增强型的 NullPointerException。2019年2月,它被提议作为OpenJDK社区的一个增强,之后很快,它成为了一个JEP。所以,该功能在2019年10月完成并在JDK 14版本推出。本质上,JEP 358 旨在通过描述某个变量是 “null” 来提高 JVM 生成的 “NullPointerException” 的可读性。JEP 358通过在方法、文件名和行号旁边描述为 null 的变量,带来了一个详细的 NullPointerException 消息。它通过分析程序的字节码指令来工作。因此,它能够精确地确定哪个变量或表达式是null。最重要的是,JDK 14中默认关闭详细的异常消息。要启用它,我们需要使用命令行选项:


  1. -XX:+ShowCodeDetailsInExceptionMessages

2.1 详细的异常信息

考虑在激活 ShowCodeDetailsInExceptionMessages 标志的情况下再次运行代码:


  1. Exceptionin thread "main" java.lang.NullPointerException:

  2. Cannot invoke "RegistryAddress.getCity()" because the return value of

  3. "com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$DetailInfos.getRegistryAddress()"isnull

  4. at com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException.main(HelpfulNullPointerException.java:10

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

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


  1. Cannot invoke "String.toLowerCase()" because the return value of "getEmailAddress()"isnull

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

3. 技术方面

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

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

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

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


  1. Employee employee = null;

  2. employee.getName();


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


  1. "com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()"

  2. because "employee"isnull


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


  1. Cannot invoke

  2. "com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()"

  3. because ""isnull


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

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

作者:HUWD https://blog.csdn.net/weixin_45089791/article/details/116921075/

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

------ 特别推荐 ------

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
18强决出14席,国足收大礼,末轮输球也能出线,泰国开心早了!

18强决出14席,国足收大礼,末轮输球也能出线,泰国开心早了!

我就是一个说球的
2024-06-07 22:51:07
温州六中46名学生出游溺亡,头七集体回教室上课,到底是咋回事?

温州六中46名学生出游溺亡,头七集体回教室上课,到底是咋回事?

阿胡
2024-06-06 12:38:23
38岁已婚女与37岁情人,在石凳子上发生关系,温存后被残忍杀害

38岁已婚女与37岁情人,在石凳子上发生关系,温存后被残忍杀害

胖胖侃咖
2024-06-08 08:00:08
江苏一考生,突然用橡皮擦擦掉全部答案,监考老师瞥一眼后大惊失色,立即报警!

江苏一考生,突然用橡皮擦擦掉全部答案,监考老师瞥一眼后大惊失色,立即报警!

小孩说
2024-06-06 11:03:16
一个时代的终结:好莱坞传奇女演员桑德拉·布洛克宣布息影

一个时代的终结:好莱坞传奇女演员桑德拉·布洛克宣布息影

自由的饼干Pn
2024-05-27 08:03:39
女子商场殴打丈夫后续:男子系倒插门,已离婚,带伤替前妻求情

女子商场殴打丈夫后续:男子系倒插门,已离婚,带伤替前妻求情

兰子记
2024-06-07 22:03:29
曝广东一公司月薪6千招前台,要求外出应酬:跟不是男朋友以外的人做

曝广东一公司月薪6千招前台,要求外出应酬:跟不是男朋友以外的人做

可达鸭面面观
2024-06-08 11:12:56
发现妻子出轨第5天,我麻利做完财产分割,微笑祝福他俩白头偕老

发现妻子出轨第5天,我麻利做完财产分割,微笑祝福他俩白头偕老

星辰故事屋
2024-06-05 12:18:58
湖人在行动!8年1亿美元肥约报价赫尔利 确定试训两大热门新秀

湖人在行动!8年1亿美元肥约报价赫尔利 确定试训两大热门新秀

罗说NBA
2024-06-08 07:11:26
汪峰机场接一双儿女,对待醒醒态度反差大,江小宴说得真没错!

汪峰机场接一双儿女,对待醒醒态度反差大,江小宴说得真没错!

娱圈小愚
2024-06-08 09:42:20
哪一年高考最难?2035年或迎来竞争最激烈一届,此后难度断崖式下跌

哪一年高考最难?2035年或迎来竞争最激烈一届,此后难度断崖式下跌

可达鸭面面观
2024-06-07 23:34:03
菲律宾撤离部分搁浅登陆舰人员,只能出不能进,局势出现新转折点

菲律宾撤离部分搁浅登陆舰人员,只能出不能进,局势出现新转折点

说天说地说实事
2024-06-08 08:10:11
厉害,语文老师押中高考作文登上热搜!评论区却把人笑死了

厉害,语文老师押中高考作文登上热搜!评论区却把人笑死了

智学园
2024-06-07 23:36:47
禁电动车后,广州三元里店铺成片倒闭,街道办终于服软了!

禁电动车后,广州三元里店铺成片倒闭,街道办终于服软了!

财话连篇
2024-06-07 09:43:14
消息人士称黎巴嫩真主党武装已提升战备状态

消息人士称黎巴嫩真主党武装已提升战备状态

界面新闻
2024-06-08 09:38:14
宣布了!又一昔日巨头,退市!

宣布了!又一昔日巨头,退市!

中国基金报
2024-06-08 00:09:38
暴跌95%,中国葡萄酒,崩了

暴跌95%,中国葡萄酒,崩了

市值Observation
2024-06-07 20:32:35
韩媒:孙兴慜、李刚仁、黄仁范等球员将在对阵中国时首发

韩媒:孙兴慜、李刚仁、黄仁范等球员将在对阵中国时首发

懂球帝
2024-06-08 10:02:19
越闹越大!25万人夜查后投放共享电动车,网友:谁家小公子创业?

越闹越大!25万人夜查后投放共享电动车,网友:谁家小公子创业?

紫雨随风舞
2024-06-07 18:33:56
超重磅会议!又要出大招了

超重磅会议!又要出大招了

樱桃大房子
2024-06-07 22:24:30
2024-06-08 12:52:49
Java精选
Java精选
一场永远也演不完的戏
1551文章数 3855关注度
往期回顾 全部

科技要闻

今年数学到底有多难?大模型:我也不太会

头条要闻

多个城市二手房下限跌破1000元每平 有保姆拥有2套房

头条要闻

多个城市二手房下限跌破1000元每平 有保姆拥有2套房

体育要闻

她拯救了WNBA,却为何被疯狂针对?

娱乐要闻

汤唯抵达巴黎将担任奥运火炬手

财经要闻

重磅详解:为什么美国经济还没有衰退?

汽车要闻

上汽大通大家9售26.99万起 综合续航1300km+

态度原创

手机
健康
游戏
教育
房产

手机要闻

魅族 20 系列手机 Flyme AIOS 内测招募 6 月 11 日开启

晚餐不吃or吃七分饱,哪种更减肥?

《艾诺提亚:失落之歌》社区竞赛活动 送定制PS5

教育要闻

高中地理规范答题建议,比知识更重要!速存!2024高考九科蒙题技巧,有用!

房产要闻

顶流地段+顶级户型!香港半山豪宅,已成为高净值人群的资产压舱石!

无障碍浏览 进入关怀版