相信在坐的每一位 Java 程序员都遇到过空指针异常: NullPointerException(NPE),不甚其烦。

栈长之前也分享几篇避免空指针的文章,空指针异常神鬼莫测,它几乎可以出现在程序中的任何位置,想尝试捕获处理是不太切实际的。

背景

我们一般要通过 JVM 异常报告的代码位置去处理,JVM 会打印出导致空指导异常的详细类名、方法名以及行号,如以下异常所示:

Exception in thread "main" java.lang.NullPointerExceptionat 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,它现在也终于来了。

详细的空指针异常信息

详细可以看官方这篇介绍:

https://openjdk.java.net/jeps/358

Exception in thread "main" java.lang.NullPointerException:Cannot read field "name" because "params.user" is nullat 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 nullat Test.main(Test.java:18)

注意:在同一行上显示异常类型、异常消息会导致行很长,所以为了保持可读性,会在第二行显示详细异常信息。

另外,这个功能在 Java 14 默认情况下是不开启的,可以使用以下 JVM 参数进行切换:

开启:-XX:+ShowCodeDetailsInExceptionMessages
关闭:-XX:-ShowCodeDetailsInExceptionMessages

为什么现在默认不开启?

1)性能

如果应用程序频繁地抛出并打印异常堆栈消息,势必会带来一定的开销、影响性能,所以应尽量避免这种开销。

2)安全

这个会导致更多源代码的暴露,如果这个不能接受,则不应由 JVM 配置应用程序打印,而应捕获并丢弃。

3)兼容性

过去的 JDK 都是不打印详细空指针异常信息的,JVM 相关工具要依赖于异常消息的准确格式,有可能会存在兼容性问题。

所以,这个特性暂时默认是关闭的,在未来不久的版本中会默认开启。

好了,今天就到这了,关注Java技术栈,新特性实战陆续更新中,第一时间推送。历史 Java 8 - 14 新特性教程可以关注我获取。

栈长原创和整理不易,觉得文章不错,在看、转发分享给更多的朋友们,总能帮助有需要的人,大家一起流弊~

使用lambdaquery() 报空指针异常_Java 14 来势汹汹,这回让空指针无处遁形!!相关推荐

  1. java数组空指针一场_Java使用自定义类数组报空指针异常

    一开始自定义了一个学生类,类里面有几个属性.因为有很多个学生,所以想将这个类声明成数组使用,但是当我通过不同的下标给数组里不同对象赋值的时候一直报空指针异常 一开始代码是这样的 package _4_ ...

  2. poi报空指针_POI 导出文件 报空指针异常 --Docker 中

    爬坑系列----Redis查询key报空指针异常,而redis中确实存在该key 现象: 1.在A方法中根据key查询一个list,可以获取到相应的值 2.在B方法中同样调用此方法,传入相同的key, ...

  3. java hash=0报空指针_怎么报空指针异常错误?

    源自:2-2 开发第一个自定义标签 怎么报空指针异常错误? java.lang.NullPointerException at org.apache.tomcat.util.descriptor.tl ...

  4. xutils找id报空指针异常

    xutils找id报空指针异常,遇到这个问题看子页面是否没有加入 这行代码 ViewUtils.inject(this, mHomeView); @ViewInject(R.id.flash_view ...

  5. 爬坑系列----Redis查询key报空指针异常,而redis中确实存在该key

    爬坑系列----Redis查询key报空指针异常,而redis中确实存在该key 参考文章: (1)爬坑系列----Redis查询key报空指针异常,而redis中确实存在该key (2)https: ...

  6. spring boot整合Quartz 在Job类中注入其他对象报空指针异常java.lang.NullPointerException at com.sxt.quartz.QuartzDemo.e

    情况在Job 类中注入RedisTemplate 报空指针异常 原因:我们使用JobDetailFactoryBean 帮我们创建对象 实际上调用的是AdaptableJobFactory 下的这个方 ...

  7. Java定时任务处理异常空指针,执行定时器报空指针异常

    我遇到的问题是启动定时器,然后在跟数据库交互的地方报错,Exception in thread "Timer-1" java.lang.NullPointerException.后 ...

  8. 关于equals()方法的调用报空指针异常的问题---常量在前,变量在后

    代码如下: 这时候会报空指针异常 package pratice;public class Temp {public static void main(String[] args) {String s ...

  9. 10.SpringBootTest测试类中引入Service,报空指针异常NullPointerException

    在测试类中引入了SysUserServiceImpl,在用该service调用getInfo()时,报空指针异常.搜索发现需要在测试类上加注解@RunWith(SpringRunner.class) ...

最新文章

  1. python读数据-Python如何读写字节数据
  2. eclipse android logcat 只显示自己应用程序信息的设置方法
  3. 栈顶指针到底指向哪_被称为“程序员试金石”的指针真的没有那么难!不信的话你来看看
  4. WCF简单教程(5) 用IIS做Host
  5. 浅谈各种连接池中连接数量的设置
  6. Python处理CSV大文件特定行数据
  7. Enumeration与Iterator接口
  8. PDF中批量数据的提取与处理
  9. php使用redis实例,php中使用redis队列操作实例代码
  10. css实现页面标签的跳转
  11. JAVA全栈工程师之路
  12. pdf.js预览pdf文件流(base64)
  13. 南审计算机科学与技术学什么,南京审计大学是几本?是一本、二本还是三本?
  14. 从南极之争谈软件架构十个技巧,及…
  15. vagrant的同步文件配置,配置虚拟机ip映射
  16. maven LTDM 部署前台Tomcat 各种折腾---自己总结经验
  17. C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C
  18. Python自动翻译英语论文PDF(三十九)
  19. sender通用收发包测试工具
  20. UART串口通讯协议

热门文章

  1. 【Java】计算当n=9时n!的值,并分别输出1!到9!各阶乘的值
  2. C 语言实例 - 判断三边能否构成三角形
  3. 数据结构链表例程_如何掌握RxJava例程的四个结构
  4. magic feature_停止将PostgREST称为“ MAGIC”!
  5. virtualbox中windows虚拟机安装增强功能
  6. 力扣-二叉树的层序遍历
  7. Python中使用PhantomJS抓取Javascript网页数据
  8. 字典按照值或键进行排序
  9. 腾讯云实验之搭建 GIT 服务器教程
  10. 牛人(周志华)推荐的人工智能网站