JDK 14的新特性:更加好用的NullPointerExceptions

让99%的java程序员都头痛的异常就是NullPointerExceptions了。NullPointerExceptions简称NPE,它是运行时异常的一种,也是java程序中最最容易出现的异常。

出现了NullPointerExceptions之后我们怎么处理呢?

一般情况下就是看日志,看一下到底哪一行出错了。如果这一行只有简单的代码,那么很容易就找到问题所在。

要命的是如果这一行很复杂,那么找出问题就不是那么容易了。很有可能我们需要向前debug100行,向后debug50行才能解决。

最大的问题就是如果这个异常出现在线上环境,debug是不可能debug了。这时候就要靠你的肉眼,你对程序的敏感程度再加上你的专业素养,才能从万花丛中找出那个问题。

举个例子,我们定义一个CustUser和Address:

@Data
public class CustUser {
private String userName;
private Address address;
}
@Data
public class Address {
private String addressName;
}

再来产生一个NPE:

@Slf4j
public class NPEUsage { public static void main(String[] args) {
Address address=new Address();
CustUser custUser=new CustUser();
custUser.setAddress(address);
log.info(custUser.getAddress().getAddressName().toLowerCase());
}
}

上面代码中的最后一行,因为addressName是空的,所以在调用toLowerCase的时候会抛出NPE。运行结果如下:

Exception in thread "main" java.lang.NullPointerException
at com.flydean.nullpointerexceptions.NPEUsage.main(NPEUsage.java:16)

上述异常只告诉我们有一个NPE在第16行。但是16行有一长串代码,到底是哪里报了这个异常呢?

简单代码,比如上面我们提的例子,简单分析一下就知道问题所在了。但是对于那么犹如蛛网一样的复杂的项目,找起来就很难了。

别害怕,JEP 358: Helpful NullPointerExceptions就是用来解决这个问题。

还是上面的例子,还是上面的配方和味道,我们只需要在运行时加上下面的参数:

-XX:+ShowCodeDetailsInExceptionMessages

运行一下:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because the return value of "com.flydean.nullpointerexceptions.Address.getAddressName()" is null
at com.flydean.nullpointerexceptions.NPEUsage.main(NPEUsage.java:16)

看到不同之处了吗?完整的出错信息被打印出来了。你苦思冥想的问题解决了。

这个特性好是好,但是默认情况下是被关闭的。

有利就有弊,我们看下这个参数有什么影响:

  1. 性能影响:因为要存储额外的信息,对 stack trace会有性能上面的压力。

  2. 安全影响:从上面的例子我们可以看到异常信息中包含了非常充分的代码信息内容。如果对一些机密应用,完全可以通过异常信息来推断代码逻辑。从而对安全性造成影响。

  3. 兼容性:最后是兼容性,之前的JVM可没有存储这些额外的NPE信息,所以可能会有兼容性的问题。

本文的例子https://github.com/ddean2009/learn-java-base-9-to-20

欢迎关注我的公众号:程序那些事,更多精彩等着您!

更多内容请访问 www.flydean.com

JDK 14的新特性:更加好用的NullPointerExceptions的更多相关文章

  1. JDK 14的新特性:instanceof模式匹配

    JDK 14的新特性:instanceof模式匹配 JDK14在2020年的3月正式发布了.可惜的是正式特性只包含了最新的Switch表达式,而Records,patterns,text blocks ...

  2. Java 15 正式发布, 14 个新特性,刷新你的认知!!

    JDK 15 2020/09/15 如期而至! 这个时间牛逼啊,和苹果发布会同天? OracleJDK 15 发布地址: https://www.oracle.com/java/technologie ...

  3. 译文《全新首发JDK 16全部新特性》

    封面:洛小汐 译者:潘潘 JDK 8 的新特性都还没摸透,JDK 16 的新特性就提着刀来了. 郑重申明: 第一次冒险翻译专业领域的文献,可想而知,效果特别糟糕.一般翻译文献特别是 技术专业领域 的内 ...

  4. JDK 5 ~ 10 新特性倾情整理!

    JDK 5 ~ 10 新特性倾情整理! 最近连 JDK11都在准备发布的路上了,大家都整明白了吗?也许现在大部分人还在用6-8,8的新特性都没用熟,9刚出不久,10-11就不用说了. 为了大家对JDK ...

  5. Java JDK 1.7 和 JDK 1.8 新特性

    0 引言 本文主要介绍 Java JDK 中 1.7 和 1.8 的新特性. 1 JDK 1.7 新特性 1. switch可以接受String类型: public class Switch { pu ...

  6. JDK各版本新特性!

    1.JDK1.5 新特性 1.自动装箱与拆箱:自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中.自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取 ...

  7. Java 9的14个新特性总结

    Java 9 包含了丰富的特性集.虽然Java 9没有新的语言概念,但是有开发者感兴趣的新的API和诊断命令. 我们将快速的,着重的浏览其中的几个新特性:  模块化系统–Jigsaw 项目 模块化是一 ...

  8. JDK 5 ~ 11 新特性倾情整理

    为了大家对JDK有一个全面的了解,下面我为大家整理了JDK5~11的所有关键新特性! 先看一下JDK的版本迭代图: 注:   OpenJDK和JDK区别  GPL协议通用性公开许可证(General ...

  9. JDK 1.8 新特性之Date-Time API

    来源:请点击查看 1.8之前的日期类: 线程不安全:java.util.Date 这个类线程不安全,而且所有日期类都是可变的. 时间处理麻烦:默认的开始日期从1900年,不支持国际化,不提供时区支持, ...

随机推荐

  1. Html 慕课园编程练习9-22

    题目要求: 制作一个表格,显示班级的学生信息. 要求: 1. 鼠标移到不同行上时背景色改为色值为 #f2f2f2,移开鼠标时则恢复为原背景色 #fff 2. 点击添加按钮,能动态在最后添加一行 3. ...

  2. Redis 笔记(四)—— SET 常用命令

    常用命令 命令 用例和描述 SADD SADD key item [item ...] —— 将一个或多个元素添加到集合中,返回添加的数量 SREM SREM key item [item ...] ...

  3. Azure多因素认证

    什么是多重身份验证? 双重验证是需要多种验证方法的身份验证方法,可为用户登录和事务额外提供一层重要的安全保障. 它的工作原理是需要以下两种或多种验证方法: 用户知道的某样东西(通常为密码) 用户具有的 ...

  4. cephfs分布式系统

                                                               cephfs分布式系统 CephFS:分布式文件系统 l 什么是CephFS: 分 ...

  5. Navicat安装教程

    Navicat安装教程 1.下载: 链接:https://pan.baidu.com/s/1uLlstPYrsjaNhZqVu9aFfQ 提取码:393r 2.下载完成之后如图所示: 首先安装第二个, ...

  6. 在IDEA导入maven项目

    1.依次打开File—New—Module from Existing Sources...

  7. readelf命令

    //查看文件头信息 readelf -h [file] //查看文件依赖的动态库 readelf -d [file] //查看文件中的符号 readelf -s [file]

  8. hexo部署在码云中 无样式问题

    在本地localhost:4000 运行如下 上传码云之后打开Gitee Pages服务 如下 同时控制台打印 解决方法 找到根目录下的_config.yml中的url 和 root # url: h ...

  9. 生成3D多棱柱的方法(3D立体图片)

    先上一个效果图 主要运用的技术点就是 确认基点,确认每个盒子旋转的度数 3D变换  transform: rotateY(-360deg); 景深  perspective 3D舞台 transfor ...

  10. AJ学IOS(12)UI之UITableView学习(上)LOL英雄联盟练习

    AJ分享,必须精品 先看效果图 源代码 NYViewController的代码 #import "NYViewController.h" #import "NYHero. ...