jdk8 npe

我的2019年3月博客文章“ Java会出现更好的默认NullPointerException消息吗? ”的撰写是为了获得更好的NullPointerException消息的JEP 草案尚未针对特定的JDK版本。 此后,该JEP草案成为JEP 14的 目标 JEP 358(“ Helpful NullPointerExceptions”) 。 更好的是,初始实现( JDK-8218628 ) 已经在JDK 14分支中 ,并且可以在JDK 14 Early Access Builds 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

jdk8 npe

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

  1. JDK 14中更好的NPE消息

    我的2019年3月博客文章" Java会出现更好的默认NullPointerException消息吗? "是在尚未针对特定JDK版本针对更好的NullPointerExceptio ...

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

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

  3. 在Flutter中更快地加载您的图像资源

    本文主要介绍在Flutter中更快地加载您的图像资源 我们可以将图像放在我们的资产文件夹中,但如何更快地加载它们?这是 Flutter 中的一个秘密函数,可以帮助我们做到这一点 - precacheI ...

  4. ios 图像翻转_在iOS 14中使用计算机视觉的图像差异

    ios 图像翻转 Human eyes are very receptive to visual representations. Similarly, computer vision enables ...

  5. idea中drl文件_得分DRL:在OptaPlanner中更快,更轻松

    idea中drl文件 对于OptaPlanner (= Drools Planner)6.0.0.Beta1,我已经用更优雅的ConstraintMatch系统替换了ConstraintOccurre ...

  6. mockito环境配置_Mockito –使用全局配置的SmartNull在NPE上提供更好的错误消息

    mockito环境配置 编写Mockito参考卡后,我有机会仔细研究了Mockito不太流行但非常有用的功能. 其中一些过于先进或太稀少,无法在refcard中进行描述,因此应简短说明. 其中之一就是 ...

  7. Mockito –使用全局配置的SmartNull在NPE上提供更好的错误消息

    编写Mockito参考卡后,我有机会仔细研究了Mockito不太流行但非常有用的功能. 其中一些过于先进或太稀少,无法在refcard中进行描述,因此应简短说明. 其中之一就是SmartNull. 当 ...

  8. Java 14 中令人期待的五大新特性!

    随着新的 Java 发布生命周期的到来,新版本预计将于 2020 年 3 月发布,本文将对其中的 5 个主要特性作些概述. 作者 | Sylvain Saurel 译者 | 苏本如,责编 | 郭芮 出 ...

  9. java –cp ./:_7位专家– 7条意见:您想在Java 14中看到什么?

    java –cp ./: 尽管就新功能而言,Java 13并不是一个巨大的版本,但它具有一些令人印象深刻的升级和功能预览. Java 13证明13并不是一个不幸的数字. 就像Java 12一样,它按照 ...

最新文章

  1. uniapph5配置index.html模板路径不生效解决办法
  2. 【Python】Scrapy爬虫实战(豆瓣电影 Top 250)
  3. python处理excel大数据-【Python 模块】 xlrd 读取 Excel 文件
  4. ORACLE RAC 中 SRVCTL 命令详细说明
  5. Training a classifier
  6. python 多线程--重点知识
  7. 【Pytorch神经网络理论篇】 16 过拟合问题的优化技巧(三):批量归一化
  8. java堆算法_用Java写算法之七:堆排序
  9. 关于static 和 const
  10. 各厂商磁编码器对比,AS5047、AS5048、AS5600、TLE5012、MA730
  11. Excel Spreadsheet 转换web HTML 5 展示
  12. 注册使用GAC【转载】
  13. 硬盘格式化怎么操作 硬盘格式化后数据还在吗
  14. android java标准时间_关于android:Java中格林尼治标准时间的毫秒数
  15. The operated node must be in the list returned by getNodeIDList
  16. 零跑坚持自主研发,探索数字时代的驾驶体验
  17. java.lang.NullPointerException: Missing required view with报错
  18. 微信小程序编辑器,支持wxss,支持wxml
  19. 【Linux】进程信号
  20. sanity测试_Sanity.io入门-您可以自定义的无头CMS

热门文章

  1. 世界五星级大厨经典菜品集
  2. P3166-[CQOI2014]数三角形【GCD】
  3. P4989-二进制之谜【堆,贪心】
  4. jzoj4226-A【图论】
  5. 【dfs】【bfs】【链表】 求连通分量 (ssl 1759)
  6. 10、mybatis中缓存的使用
  7. SpringBoot集成Flowable
  8. 机器学习中向量化编程总结记录
  9. Mybatis简介与原理
  10. Oracle入门(十)之概要文件