Java 14 来势汹汹,这回让空指针无处遁形!!
相信在坐的每一位 Java 程序员都遇到过空指针异常: NullPointerException(NPE)
,不甚其烦。
栈长之前也分享几篇避免空指针的文章:
空指针异常神鬼莫测,它几乎可以出现在程序中的任何位置,想尝试捕获处理是不太切实际的。
背景
我们一般要通过 JVM 异常报告的代码位置去处理,JVM 会打印出导致空指导异常的详细类名、方法名以及行号,如以下异常所示:
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:3)
很显然,Test 类的 main 方法第 3 行发生了空指针异常,如果第 3 行的代码是:
javastack.name = '栈长';
这时候我们肯定能判定 javastack 对象为 null,如果是下面这段呢:
javastack.name = params.user.name;
以下这 e 个对象都可能为空:
- javastack
- params
- user
这时候就无法通过 JVM 报告的位置所判定到底是哪个变量为空了,每一个对象都可能是空指针的入口,只能通过输出日志或者 Debug 调试去跟踪了。
如果 JVM 可以提供足够明确的信息以显示空指针异常的具体来源,而无需额外的代码、工具来定位,那么这对开发人员、或者线上问题定位都举足轻重。当然,这个在商业 JVM 早就做到了,Java 14,它现在也终于来了。
详细的空指针异常信息
详细可以看官方这篇介绍:
Exception in thread "main" java.lang.NullPointerException:
Cannot read field "name" because "params.user" is null
at Test.main(Test.java:3)
如上所示,会给出详细的发生空指针异常变量路径。
另外,如果是下标式访问的赋值语句,如 a[i][j][k] = 2020;
抛出空指针,那会是这样的:
Exception in thread "main" java.lang.NullPointerException:
Cannot load from object array because "a[i][j]" is null
at Test.main(Test.java:18)
注意:在同一行上显示异常类型、异常消息会导致行很长,所以为了保持可读性,会在第二行显示详细异常信息。
另外,这个功能在 Java 14 默认情况下是不开启的,可以使用以下 JVM 参数进行切换:
开启:-XX:+ShowCodeDetailsInExceptionMessages
关闭:-XX:-ShowCodeDetailsInExceptionMessages
为什么现在默认不开启?
1)性能
如果应用程序频繁地抛出并打印异常堆栈消息,势必会带来一定的开销、影响性能,所以应尽量避免这种开销。
2)安全
这个会导致更多源代码的暴露,如果这个不能接受,则不应由 JVM 配置应用程序打印,而应捕获并丢弃。
3)兼容性
过去的 JDK 都是不打印详细空指针异常信息的,JVM 相关工具要依赖于异常消息的准确格式,有可能会存在兼容性问题。
所以,这个特性暂时默认是关闭的,在未来不久的版本中会默认开启。
好了,今天就到这了,关注微信公众号:Java技术栈,新特性实战陆续更新中,公众号第一时间推送。历史 Java 8 - 14 新特性教程可以在公众号回复 java 获取。
栈长原创和整理不易,觉得文章不错,在看、转发分享给更多的朋友们,总能帮助有需要的人,大家一起流弊~
推荐去我的博客阅读更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
觉得不错,别忘了点赞+转发哦!
Java 14 来势汹汹,这回让空指针无处遁形!!的更多相关文章
- Java 14 祭出代码简化大器,Lombok 要被干掉了?
Java 14 3 月发布距现在已经发布 2 个多月,发布了很多新特性,详细的新特性介绍可以看这篇文章: http://www.javastack.cn/article/2020/java14-has ...
- Java 14带来了许多新功能
本文是作者翻译自java magazine的文章,我也将回持续的关注java的最新消息,即时和大家分享.如有翻译不准确的地方,欢迎大家留言,我将第一时间修改. Java 14包含比前两个发行版更多 ...
- Java安全之反序列化回显研究
Java安全之反序列化回显研究 0x00 前言 续上文反序列化回显与内存马,继续来看看反序列化回显的方式.上篇文中其实是利用中间件中存储的Request 和Response对象来进行回显.但并不止这么 ...
- Java安全之挖掘回显链
Java安全之挖掘回显链 0x00 前言 前文中叙述反序列化回显只是为了拿到Request和Response对象.在这里说的的回显链其实就是通过一连串反射代码获取到该Request对象. 在此之前想吹 ...
- Java 14 新功能介绍
不做标题党,认认真真写个文章. 文章已经收录在 Github.com/niumoo/JavaNotes 和未读代码博客,点关注,不迷路. Java 14 早在 2019 年 9 月就已经发布,虽然不是 ...
- java判断字符串是否回文
java判断字符串是否回文 /** * java判断字符串是否回文<br><br> * 基本思想是利用字符串首尾对应位置相比较 * * @author InJavaWeTrus ...
- Java 14 可能带来什么新特性?
JDK/Java 13 在一个月前已经发布,该版本带来了 5 大新特性,笔者观察到其中的 Text Blocks(文本块)特性似乎被讨论最多. 文本块特性与常见的 Python "" ...
- Java 14 都要来了,为什么还有这么多人固守Java8?
作者:刘欣 从Java 9开始,Java版本的发布就让人眼花缭乱了. 每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份, ...
- Java 14 令人期待的 5 大新特性,打包工具终于要来了
随着新的 Java 发布生命周期的到来,新版本预计将于 2020 年 3 月发布,本文将对其中的 5 个主要特性作些概述. Java 13刚刚发布给开发人员使用不久,最新版本的JDK于2019年9月发 ...
随机推荐
- vscode快速生成html模板(vscode快捷键"!"生成html模板)
问题: 在vscode中新建test.html, 内容是空白的,输入"!",然后按tap键 ,没有生成常见的html模板,也就是如下: 输入! html html:5 DOCTYP ...
- 自定义上下文菜单,contextmenu事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android对话框(Dialog)
Android对话框 前几天出差没有进行更新,今天写一下安卓中用的比较多的对话框——AlertDialog. dialog就是一个在屏幕上弹出一个可以让用户做出一个选择,或者输入额外的信息的对话框,一 ...
- TensorFlow系列专题(八):七步带你实现RNN循环神经网络小示例
欢迎大家关注我们的网站和系列教程:http://panchuang.net/ ,学习更多的机器学习.深度学习的知识! [前言]:在前面的内容里,我们已经学习了循环神经网络的基本结构和运算过程,这一小节 ...
- HTTP 请求状态码
200 请求成功 304 从缓存中读取 302 + 响应头中定义location: 重定向 // 自定义重定向 @RequestMapping("/customRedirecti ...
- 1.用eclipse创建maven工程
第一步.File→New→Maven Project (需要下载安装配置Maven等,这些步骤省略) (找不到的话选Other,里面的Maven文件夹里有) 二.记得勾选上,然后点Next 三.填完点 ...
- Educational Codeforces Round 83 (Rated for Div. 2)
A. Two Regular Polygons 题意:给你一个 正n边形,问你能否以这个 n 的其中一些顶点组成一个 m边形, 思路 :如果 n % m == 0 ,就可 收获:边均分 B. Bogo ...
- Oracle ROWNUM用法
很多朋友应该跟我一样有个疑问,为什么rownum > 5 的时候会查不到一条数据,用rownum < 5就可以查到数据,明明查询所有的时候rownum有很多啊,小朋友,你是不是有很多问号? ...
- 谷歌 MapReduce 初探
谷歌“三驾马车”的出现,才真正把我们带入了大数据时代,毕竟没有谷歌,就没有大数据. 上次的分享,我们对谷歌的其中一驾宝车 GFS 进行了管中窥豹,虽然只见得其中一斑,但是也能清楚的知道 GFS 能够把 ...
- 记一次Windb死锁排查
正在开会,突然线上站点线程数破千.然后一群人现场dump分析. 先看一眼线程运行状态 !eeversion 发现CPU占用并不高,19%,937条线程正在运行. 看看他们都在干什么. ~* e !cl ...