我的2019年3月博客文章“ Java会出现更好的默认NullPointerException消息吗? ”是在尚未针对特定JDK版本针对更好的NullPointerException消息的JEP 草案编写时编写的。 此后,该JEP草案成为JEP 14的 目标 JEP 358(“ Helpful NullPointerExceptions”) 。 更好的是,初始实现( JDK-8218628 ) 已经在JDK 14分支中 ,并且可以在JDK 14 Early Access Build Build 20(2019/10/23)中使用

在本文中,我将针对JDK 14 Early Access Build 20运行先前文章中介绍的示例代码 ,以演示现在提供的其他详细信息。 要查看为故意引入导致NullPointerException的各种情况而编写的示例代码,请参阅前面的文章或查看GitHub上的源代码 。

下载JDK 14 Early Access Build 20并按其路径指向该文件后,运行java -version时会看到以下内容:

 openjdk version "14-ea" 2020 - 03 - 17  OpenJDK Runtime Environment (build 14 -ea+ 20 - 879 )  OpenJDK 64 -Bit Server VM (build 14 -ea+ 20 - 879 , mixed mode, sharing) 

在正确配置了JDK 14 Early Access Build 20之后 ,我重新构建了前面提到的源代码 ,然后使用Java启动器重新运行了该代码,而没有任何新选项。 该输出(如下所示)与以前的JDK版本的输出没有实质性差异。

 =========================================  | # | # 1 : Element [ null boolean array | ] on : Element [ 0 ] on  =========================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateFirstExampleIndexAccessOnNullBooleanArray(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  =================================  | # | # 2 : .length on null boolean [] |  =================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateSecondExampleLengthOnNullBooleanArray(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  =======================================  | # | # 3 : Assigning float : Assigning to null float [] |  =======================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateThirdExampleAssigningValueToElementOfNullFloatArray(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  ======================================  | # | # 4 : Accessing field on null object | : Accessing field on object |  ======================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateFourthExampleAccessInstanceFieldOfNullObject(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  ===================  | # | # 5 : throw null ; | ; |  ===================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateFifthExampleThrowingConstantNull(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  ================================================  | # | # 6 : Method invocation on null instance field | : Method invocation on  ================================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateSixthExampleMethodInvocationOnNullInstanceField(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  =============================================  | # | # 7 : () on null instance field | () on synchronized () on instance field |  =============================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateSeventhExampleSynchronizedNullInstanceField(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  ==========================================================================  | >>> Null Lost in Long Series of Method Invocations in Single Statement |  ==========================================================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateNullLostInSeriesOfMethodInvocationsInSingleStatement(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  =======================================================  | >>> Null Lost in Dereferenced Constructor Arguments |  =======================================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateNullLostInConstructorAcceptingMultiplePotentiallyNullArgumentsDereferenced(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  ==================================================  | >>> Null Lost in Dereferenced Method Arguments |  ==================================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateNullLostInMethodAcceptingMultiplePotentiallyNullArgumentsDereferenced(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source) 

如以上输出所示,即使使用新的JDK 14 Early Access Build 20,当我正常运行应用程序时,也看不到有关NullPointerException的任何新的详细信息。 我包含了此输出,以表明需要一个特殊的标志来启用更详细的NullPointerException ,并使其更方便地比较带有和不带有其他详细信息的输出。 下一个输出清单显示了将Java启动器传递给标志-XX:+ShowCodeDetailsInExceptionMessages时提供的其他详细信息:

 =========================================  | # | # 1 : Element [ null boolean array | ] on : Element [ 0 ] on  =========================================  java.lang.NullPointerException: Cannot load from byte / boolean array because java.lang.NullPointerException: Cannot load from array because "<local1>" is null at dustin.examples.npe.NpeDemo.demonstrateFirstExampleIndexAccessOnNullBooleanArray(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  =================================  | # | # 2 : .length on null boolean [] |  =================================  java.lang.NullPointerException: Cannot read the array length because "<local1>" is null at dustin.examples.npe.NpeDemo.demonstrateSecondExampleLengthOnNullBooleanArray(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  =======================================  | # | # 3 : Assigning float : Assigning to null float [] |  =======================================  java.lang.NullPointerException: Cannot store to array because "<local1>" is null array because java.lang.NullPointerException: Cannot store to float array because at dustin.examples.npe.NpeDemo.demonstrateThirdExampleAssigningValueToElementOfNullFloatArray(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  ======================================  | # | # 4 : Accessing field on null object | : Accessing field on object |  ======================================  java.lang.NullPointerException: Cannot read field "nullInstanceField" because "<local1>" is null at dustin.examples.npe.NpeDemo.demonstrateFourthExampleAccessInstanceFieldOfNullObject(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  ===================  | # | # 5 : throw null ; | ; |  ===================  java.lang.NullPointerException: Cannot throw exception because "null" is null at dustin.examples.npe.NpeDemo.demonstrateFifthExampleThrowingConstantNull(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  ================================================  | # | # 6 : Method invocation on null instance field | : Method invocation on  ================================================  java.lang.NullPointerException: Cannot invoke "String.isEmpty()" because "this.nullInstanceField" is null at dustin.examples.npe.NpeDemo.demonstrateSixthExampleMethodInvocationOnNullInstanceField(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  =============================================  | # | # 7 : () on null instance field | () on synchronized () on instance field |  =============================================  java.lang.NullPointerException: Cannot enter synchronized block because "this.nullInstanceField" is null at dustin.examples.npe.NpeDemo.demonstrateSeventhExampleSynchronizedNullInstanceField(Unknown Source) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  ==========================================================================  | >>> Null Lost in Long Series of Method Invocations in Single Statement |  ==========================================================================  java.lang.NullPointerException: Cannot invoke "dustin.examples.npe.DysfunctionalLocation$Province.getCity()" because the return value of "dustin.examples.npe.DysfunctionalLocation$Nation.getProvince()" is null at dustin.examples.npe.NpeDemo.demonstrateNullLostInSeriesOfMethodInvocationsInSingleStatement(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  =======================================================  | >>> Null Lost in Dereferenced Constructor Arguments |  =======================================================  java.lang.NullPointerException: Cannot invoke "java.lang.Long.longValue()" because "<local6>" is null at dustin.examples.npe.NpeDemo.demonstrateNullLostInConstructorAcceptingMultiplePotentiallyNullArgumentsDereferenced(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source)  ==================================================  | >>> Null Lost in Dereferenced Method Arguments |  ==================================================  java.lang.NullPointerException: Cannot invoke "java.lang.Long.longValue()" because "<local6>" is null at dustin.examples.npe.NpeDemo.demonstrateNullLostInMethodAcceptingMultiplePotentiallyNullArgumentsDereferenced(Unknown Source) at dustin.examples.npe.NpeDemo.main(Unknown Source) 

JEP 358解释了使用此标志来查看其他NullPointerException详细信息:“可以使用新的boolean命令行选项-XX { + | - } ShowCodeDetailsInExceptionMessages -XX { + | - } ShowCodeDetailsInExceptionMessages 。 该选项将首先具有默认值' false ',以便不打印消息。 它旨在在以后的版本中默认情况下在异常消息中启用代码详细信息。” 如我们所见,此功能默认情况下最初处于关闭状态,但是有计划在将来启用更详细的NullPointerException消息。

最近的一条Tweet问了一个问题:“如果字节码不包含变量名,它将如何工作?” 这个问题通过提供一个具体的例子来继续:“假设我们有像Object a = ....; a.getName(); //NPE这样的代码Object a = ....; a.getName(); //NPE Object a = ....; a.getName(); //NPE Object a = ....; a.getName(); //NPE NPE会Object a = ....; a.getName(); //NPE哪种消息?” 尽管在前面显示的一系列测试中都包含了一个示例,但我认为我将在此提供一个针对性更强的示例来回答该问题。 下一个代码清单(也在GitHub上提供 )显示了改编自Tweet中使用的示例的代码。

 package dustin.examples.npe;  /** * Simple demonstration to answer Tweet-ed question * "How it will work if bytecode doesn't contain variable names?" * ( https://twitter.com/2doublewhiskey/status/1180365953240055809 ). */  public class TwoDoubleWhiskeyTweetExample  { public static void main( final String[] arguments) { final Person person = null ; person.getName(); //NPE }    public static class Person { private String name; public Person( final String newName) { name = newName; } public String getName() { return name; } }  } 

下一个屏幕快照显示了使用JDK 14 Early Access Build 20(不带java启动器标志-XX:+ShowCodeDetailsInExceptionMessages运行此简单应用程序的结果。


如屏幕快照所示,在JDK 14 Early Access Build 20中使用-XX:+ShowCodeDetailsInExceptionMessages标志可提供与此简单NullPointerException示例相关的其他详细信息:“无法调用” dustin.examples.npe.TwoDoubleWhiskeyTweetExample $ Person.getName() ”,因为“ <local1> ”为空”

GitHub上提供了一个更简单甚至更接近Tweet-ed问题中提供的原始示例的示例。

JEP 358 (“ 有用的NullPointerExceptions ”)可能不像新JDK发行版中的其他一些JEP那样浮华,但最终可能是每天为Java开发人员提供比其一些浮华同行更高的价值 。 有许多示例将对您有所帮助,JEP本身以及本文引用的我的代码示例中都阐明了许多示例情况。

翻译自: https://www.javacodegeeks.com/2019/10/better-npe-messages-in-jdk-14.html

JDK 14中更好的NPE消息相关推荐

  1. jdk8 npe_JDK 14中更好的NPE消息

    jdk8 npe 我的2019年3月博客文章" Java会出现更好的默认NullPointerException消息吗? "的撰写是为了获得更好的NullPointerExcept ...

  2. JDK 14中的常规,安全和确定性外部内存访问

    在" JDK 14 Rampdown:Build 27 "一文中,我总结了JDK 14 Early Access Build #27中新增的许多针对JDK 14的功能. 已经存在另 ...

  3. 在 JDK 9 中更简洁使用 try-with-resources 语句

    本文详细介绍了自 JDK 7 引入的 try-with-resources 语句的原理和用法,以及介绍了 JDK 9 对 try-with-resources 的改进,使得用户可以更加方便.简洁的使用 ...

  4. 自动配置jdk_JDK 15中自动自动发送更好的NullPointerException消息

    自动配置jdk 我讨论了期待已久的和高度赞赏改进的NullPointerException ( NPE在帖)消息" 更好的默认NullPointerException异常消息即将到Java? ...

  5. jep290涉及jdk版本_针对JDK 14提议的另外六个JEP

    jep290涉及jdk版本 Mark Reinhold最近的消息宣布了六个新的"建议针对JDK 14的JEP ": JEP 345 , JEP 361 , JEP 363 , JE ...

  6. 针对JDK 14提议的另外六个JEP

    Mark Reinhold最近的消息宣布了六个新的"建议针对JDK 14的JEP ": JEP 345 , JEP 361 , JEP 363 , JEP 364 , JEP 36 ...

  7. Java 14:JDK 14进入GA时的所有新功能

    是的,六个月过去了这么快,现在到了,Java 14的发布即将到来. 我们一直在跟踪新JDK在过去半年中的进展,您可以在此处找到摘要的所有功能. 但是,如果您想直接进入,可以在此处找到JDK 14二进制 ...

  8. JDK 14如期发布,16个新特性快速预览

    JDK 14已经于2020年3月17日如期发布.本文介绍JDK 14特性. JEP 305: instanceof的模式匹配(预览) 通过对instanceof运算符进行模式匹配来增强Java编程语言 ...

  9. JDK 14的征兆开始出现

    JDK 13当前处于Rampdown第一阶段 (RDP 1),计划在一周多一点的时间(2019年7月18日)进入Rampdown第二阶段 (RDP 2),并且暂定于2019年9月17日正式上市.当然, ...

最新文章

  1. BZOJ 1833 ZJOI2010 count 数字计数 数位DP
  2. SpringBoot中使用ShardingJdbc切分数据库表
  3. Verilator简介及其下载安装卸载
  4. android 百度移动搜索 url 参数,百度移动搜索开放适配服务的3种方法
  5. c0000005错误怎么解决_iTunes提示3194未知错误怎么办【解决方法】
  6. ios 主题切换 思路_iOS 使用 NSObject 的分类实现快速切换主题
  7. 两个对象数组交集_yiduobo的每日leetcode 349.两个数组的交集 amp;amp; 350.两个数组的交集II...
  8. php phar包require报错,php,_很奇怪,php 引入了phar,但是报错,说Predis\Client类找不到?,php - phpStudy...
  9. SpringCloud Consul 服务注册与发现
  10. c语言程序设计实验指导实验报告,C语言程序设计实验指导及报告.doc
  11. Android页面跳转、延时跳转、跳转传值
  12. (六)数据处理——录入、清洗、加工、描述
  13. rstudio r语言_如何在R中接受用户输入?
  14. 【平面设计基础】11:配色——配色原理
  15. Dell笔记本耳机孔插进入没有反应问题
  16. 开源项目-绩效管理系统
  17. Docker Hub镜像构建错误:returned a non-zero code: 8
  18. android下开启AP热点
  19. python中将科学计数法转数字
  20. 基于Vue2.x的前端架构,我们是这么做的

热门文章

  1. jzoj4227-B【dp,字符串】
  2. jzoj1274-游历的路线【分层图,SPFA】
  3. javafx爬取网页并且初始化网页数据
  4. Tomcat启动超时问题Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
  5. 漫画算法:无序数组排序后的最大相邻差值
  6. ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: N O)
  7. 《金色梦乡》金句摘抄(四)
  8. (选择 冒泡 插入 二分 异或)
  9. EasyUI(前端框架)
  10. arrylist和linked list区别