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. Pyhton多线程

    在了解多线程前先给大家介绍下并发和并行: 并发:多个任务一起执行 在多任务之间快速切换处理 任务数量大于cpu核数  并行:一个cpu核处理一个任务,多个cpu核同时处理多个任务 任务数量等于或者小于 ...

  2. B. The Monster and the Squirrel

    B. The Monster and the Squirrel Ari the monster always wakes up very early with the first ray of the ...

  3. 1066 Root of AVL Tree (25分)(AVL树的实现)

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  4. C9K Stackwise Virtual(一)

    一.SV技术基本说明 思科Catalyst9K平台的Stackwise Virtual技术是将两个物理的交换机虚拟成一个逻辑的实体(从网络控制层面和管理的角度来看),这两个交换机合二为一之后,将共享相 ...

  5. escape和unescape知识点

    decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码. encodeURI() 函数可把字符串作为 URI 进行编码 <script> var uri= ...

  6. python中汉字转数字

    #!/usr/bin/env python # -*- coding: utf-8 -*- common_used_numerals_tmp ={'零':0, '一':1, '二':2, '三':3, ...

  7. TP的where方法的使用

    1.Thinkphp中where()条件的使用 总是有人觉得,thinkphp的where()就是写我要进行增加.查询.修改.删除数据的条件,很简单的,其实我想告诉你,where()是写条件语句的,但 ...

  8. java解惑之常常忘记的事

    java解惑之常常忘记的事 2012-10-17 18:38:57|  分类: JAVA |  标签:基础知识  软件开发  |举报|字号 订阅     针对刚接触java的菜鸟来说,java基础知识 ...

  9. 文档根元素 "beans" 必须匹配 DOCTYPE 根 "null"

    文档根元素 "beans" 必须匹配 DOCTYPE 根 "null" (2011-11-20 21:26:41) 转载▼ 标签: 杂谈 分类: spring- ...

  10. AJ学IOS(22)UI之UIApplicationDelegate和UIWindow

    AJ分享,必须精品 UIApplicationDelegate 每次新建完项目,都有个带有“AppDelegate”字眼的类,它就是UIApplication的代理 NYAppDelegate默认已经 ...