jdk8 npe_JDK 14中更好的NPE消息

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源相册系统Java_基于JAVA的B/S网络相册管理系统

每天记录学习&#xff0c;每天会有好心情。*^_^*今天和一个朋友共同完成了一个网络相册管理系统项目&#xff0c;我们在开发时选用的框架是SSM(MYECLIPSE)框架。我这个朋友知识有限&#xff0c;只会这个框架&#xff0c;哈哈&#xff0c;都是为了方便他。和往常一样选用简单又便…

java断言——Assertion

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java断言——Assertion 的相关知识&#xff1b; 【1】使用断言 1.1&#xff09;断言机制&#xff1a; 允许在测试期间向代码中插入一些检查语句。 当代码发布时&#xff0c; 这些…

常见的并发模型_两个常见的并发错误

常见的并发模型作为Baeldung的编辑&#xff0c;我很高兴与一位作者一起撰写有关Java通用并发陷阱的文章。 这是一本不错的书&#xff0c;但是假设开发人员具有一定的能力。 我已经看到了几件即时并发失败的事情。 它们很容易添加到代码中&#xff0c;并保证为您提供奇怪的结果…

java 哈希一致算法_一致哈希算法Java实现

一致哈希算法(Consistent Hashing Algorithms)是一个分布式系统中常用的算法。传统的Hash算法当槽位(Slot)增减时&#xff0c;面临所有数据重新部署的问题&#xff0c;而一致哈希算法确可以保证&#xff0c;只需要移动K/n份数据(K为数据总量, n为槽位数量)&#xff0c;且只影响…

java日志——基本日志+高级日志

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java日志——基本日志高级日志 的相关知识&#xff1b; 【1】记录日志 1.1&#xff09;出现的问题和解决方法&#xff1a; 1.1.1&#xff09;出现的问题&#xff1a;在我们调试…

java模式匹配_用Java匹配模式

java模式匹配如果您使用的是Java&#xff0c;那么您很有可能以前已经看过它的模式匹配。 String#matches(String)方法在内部使用Pattern类型&#xff0c;该类型包含更复杂的功能&#xff1a; 通过编译正则表达式来创建Pattern 。 该模式与任何输入字符串匹配&#xff0c;并且可…

java在frame怎么计时_java – 退出jframe时的Swing stop计时器

我有一个特定的任务,我按计划的时间间隔运行.基本上我在JFrame中的Label上显示相机.但是,当我退出JFrame时,应用程序似乎运行.我怎么能阻止它&#xff1f;我已经删除了代码的细节,只是将相关部分留在了public class TaskCLass extends JFrame {JPanel p;JLabel l;Timer timer;p…

java日志——修改日志管理器配置+日志本地化

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java日志——修改日志管理器配置日志本地化 的相关知识&#xff1b; 【1】修改日志管理器配置 1.1&#xff09;可以通过编辑配置文件来修改日志系统的各种属性。 在默认情况下&a…

jpa embedded_JPA @Embeddable和@Embedded

jpa embedded介绍&#xff1a; 作为一个面向对象的开发人员&#xff0c;我们希望避免使用带有大量不相关字段的大型类。 因此&#xff0c;我们可能经常感到有必要使用多个对象来表示JPA实体。 在本快速教程中&#xff0c;我们将学习如何使用JPA或Hibernate中的Embedded和Embed…

jdk内置线程实例_EA问题的JDK14实例

jdk内置线程实例Tagir Valeev最近发布了一条有关即将发布的Java JDK14版本的预览功能的推文&#xff1a; &#xff03;Java14模式匹配将名称隐藏带入了更高的疯狂程度。 在这里&#xff0c;我为FLAG字段添加或删除了final修饰符&#xff0c;该修饰符仅在不可达的if分支中访问。…

intro to Apache Log4j 2

【0】README 0.1&#xff09;本文作为 原文&#xff08;http://logging.apache.org/log4j/2.x/&#xff09;的译文&#xff0c;仅作参考&#xff0c; 旨在了解 Log4j 2 的相关知识 &#xff1b; 0.2&#xff09; Apache Log4j 2 是Log4j的升级版&#xff0c;并对其前任Log4j …

php注册页面模板,选项卡式WordPress登陆注册模板

上次说到不用插件也可以修改WordPress登陆注册界面&#xff0c;不过只是简单的修改了CSS&#xff0c;缺少很多元素&#xff0c;例如header、导航、footer等&#xff0c;为了增加这些元素&#xff0c;我们可以采取另一种方式&#xff0c;将WordPress登陆注册界面做成page模板&am…

内核堆栈 用户堆栈_弹性堆栈介绍

内核堆栈 用户堆栈当您运行对公司至关重要的软件时&#xff0c;您将无法拥有仅用于分析一段时间前发生的事情的日志&#xff0c;让客户端告诉您您的应用程序已损坏&#xff0c;而您甚至不知道发生了什么是真实的问题。 解决该问题的方法之一是使用监视和日志记录。 大多数应用…

php 字符串 中文,php 中文字符串截取乱码

PHP截取字符串如果是英文直接用substr就可以了,但对于中文字符&#xff0c;用substring可能会导致乱码&#xff0c;那么将如何解决呢&#xff1f;1、通过函数mb_substr实现说明&#xff1a;mb_substr($str, $start, $length, $encoding);通过该函数即可&#xff0c;但需要加载p…

java 调试技巧

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java 调试技巧 的相关知识&#xff1b; 【1】调试技巧相关 1.1&#xff09;可以用下面的方法打印或记录任意变量的值&#xff1a; System.out.println("x " x); 或 …

jdk 版本和内部版本对应_JDK 14 Rampdown:内部版本27

jdk 版本和内部版本对应马克 雷因霍尔德&#xff08; Mark Reinhold&#xff09;最近的帖子“ JDK 14现在处于Rampdown第一阶段 ”宣布“我们现在处于Rampdown第一阶段”&#xff0c;并且“整体功能已冻结”。 JDK 14 Early Access Build &#xff03;27&#xff08;2019/12/12…

对一个java源文件进行正确编译,给定如下一个Java源文件Child.java,编译并运行Child.java,以下结果正确的是()...

总成化无本优部问决企题业内法解&#xff0c;给定流配特别题是物送问。而他再告真的不是己这却一诉自&#xff0c;个源文译并运行下某人重病的家得了假如人忽然间&#xff0c;的应对策略有他使用到。结果感是个人自我指一效能对&#xff1a;。哲学的规揭示律一般&#xff0c;管…

异常java.lang.Thread.dumpStack(Unknown Source)

转自&#xff1a; http://www.blogjava.net/landon/archive/2011/02/27/345265.html 昨天在公司写了一段代码&#xff0c;很简单&#xff0c;就是测试Thread的dumpStack方法的使用。 因为Thread的dumpStack方法不是很常用&#xff0c;但它对于如果想看看谁在运行时调用方法还是…

java集合框架——接口图+类图+遗留类图

【0】README 0.1&#xff09;绝对的干货&#xff0c;理清 java集合框架中类和接口的层次关系&#xff1b;

构建maven项目插件_如何构建一个Maven插件

构建maven项目插件使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 由于其插件生态系统的普及&#xff0c;Apache Maven仍然是Java领域最受欢迎的构建工具。 很容易找到…