更好的默认NullPointerException消息是否会传入Java?

我最近对OpenJDK core-libs-dev邮件列表上的2019年 2月至2019年 3月的讨论感兴趣,该讨论涉及解决缺少与NullPointerException相关联的详细消息的问题,该消息在用其无参数构造函数实例化后抛出。 这是我在使用Java时经常遇到的一个问题,甚至导致我在某些情况下更改代码以更好地解决该问题。

在许多情况下,如果语句中仅存在一个NullPointerException可能来源,并且堆栈跟踪中有行号(不是),则NullPointerException (NPE)可以是更容易解决的异常之一(或至少诊断为null )。用-g:none 编译 )。

尽管对于Java NullPointerException来说尤其具有挑战性,但是即使在某些情况下,即使对于有经验的Java开发人员,没有消息的NullPointerException也会令人失望。 没有与NullPointerException关联的消息时,最明显的情况是给定语句中有多个候选者可能抛出NullPointerException 。 这种情况的一个示例是以这种方式在每个先前方法的返回对象上调用方法: getA().getB().getC()... ,其中每个方法都可能返回null 。 另一个示例是,如果调用者将null传递给被取消引用为原始类型的方法,则方法(或构造函数)的原始数据类型的多个参数可能导致NullPointerException

增强功能JDK-8218628 (“向NullPointerException添加详细消息,描述什么为null。”)解决了其中一些情况。 此增强功能的描述指出:“获取NPE时,通常很难确定表达式中的哪个引用为空。 这项更改会添加一条消息告诉您。” 此增强功能还提供了一些Java语句示例,这些示例通常会导致NullPointerException并可能令人沮丧地缺乏细节。 我已经在GitHub托管的类NpeDemo中捕获了与这些示例类似的情况(请参阅此版本以匹配下面输出中的行号)。 当执行这些演示示例(它们全部有意抛出NPE)时,使用默认设置进行编译时,输出显示如下,如下所示(仍提供完整的堆栈信息):

 =========================================  | # | # 1 : Element [ null boolean array | ] on : Element [ 0 ] on  =========================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateFirstExampleIndexAccessOnNullBooleanArray(NpeDemo.java: 37 ) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(NpeDemo.java: 179 ) at dustin.examples.npe.NpeDemo.main(NpeDemo.java: 310 )  =================================  | # | # 2 : .length on null boolean [] |  =================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateSecondExampleLengthOnNullBooleanArray(NpeDemo.java: 59 ) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(NpeDemo.java: 180 ) at dustin.examples.npe.NpeDemo.main(NpeDemo.java: 310 )  =======================================  | # | # 3 : Assigning float : Assigning to null float [] |  =======================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateThirdExampleAssigningValueToElementOfNullFloatArray(NpeDemo.java: 80 ) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(NpeDemo.java: 181 ) at dustin.examples.npe.NpeDemo.main(NpeDemo.java: 310 )  ======================================  | # | # 4 : Accessing field on null object | : Accessing field on object |  ======================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateFourthExampleAccessInstanceFieldOfNullObject(NpeDemo.java: 101 ) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(NpeDemo.java: 182 ) at dustin.examples.npe.NpeDemo.main(NpeDemo.java: 310 )  ===================  | # | # 5 : throw null ; | ; |  ===================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateFifthExampleThrowingConstantNull(NpeDemo.java: 121 ) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(NpeDemo.java: 183 ) at dustin.examples.npe.NpeDemo.main(NpeDemo.java: 310 )  ================================================  | # | # 6 : Method invocation on null instance field | : Method invocation on  ================================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateSixthExampleMethodInvocationOnNullInstanceField(NpeDemo.java: 141 ) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(NpeDemo.java: 184 ) at dustin.examples.npe.NpeDemo.main(NpeDemo.java: 310 )  =============================================  | # | # 7 : () on null instance field | () on synchronized () on instance field |  =============================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateSeventhExampleSynchronizedNullInstanceField(NpeDemo.java: 161 ) at dustin.examples.npe.NpeDemo.demonstrateJdk8218628Examples(NpeDemo.java: 185 ) at dustin.examples.npe.NpeDemo.main(NpeDemo.java: 310 )  ==========================================================================  | <<< Null Lost in Long Series of Method Invocations in Single Statement |  ==========================================================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateNullLostInSeriesOfMethodInvocationsInSingleStatement(NpeDemo.java: 198 ) at dustin.examples.npe.NpeDemo.main(NpeDemo.java: 311 )  =======================================================  | <<< Null Lost in Dereferenced Constructor Arguments |  =======================================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateNullLostInConstructorAcceptingMultiplePotentiallyNullArgumentsDereferenced(NpeDemo.java: 226 ) at dustin.examples.npe.NpeDemo.main(NpeDemo.java: 312 )  ==================================================  | <<< Null Lost in Dereferenced Method Arguments |  ==================================================  java.lang.NullPointerException at dustin.examples.npe.NpeDemo.demonstrateNullLostInMethodAcceptingMultiplePotentiallyNullArgumentsDereferenced(NpeDemo.java: 254 ) at dustin.examples.npe.NpeDemo.main(NpeDemo.java: 313 ) 

上面示例中显示的NullPointerException没有提供任何消息。 但是,在这些情况下,罪魁祸首相对容易识别,因为它们发生的方法很小,并且行号直接指向抛出NPE的位置。 如果没有行号(使用-g:none编译的源代码)并且方法很长(可能会抛出NPE的多行),或者方法的重载版本具有相同的名称,则将很难识别这些代码。

如果使用-g:none编译了代码,则堆栈跟踪中将不会显示类名或行号[仅列出(Unknown Source)而不是(文件名:行号)],检测起来可能会比较棘手。抛出NPE的位置,特别是如果是从冗长的方法中抛出很多NPE的方法抛出的,或者是从同一类中多次重载的方法抛出的,尤其是仅使用方法名称就没有帮助。

上面演示的一些示例都具有NPE,即使人们知道行号也很难识别NPE,因为该行上有很多潜在的NPE投掷者。 在这种情况下,最受JDK-8218628建议的更改。

尽管已为JDK-8218628实现了一个解决方案,但此后已确定要考虑足够的考虑因素以证明JDK增强提案 (JEP)合理,以制定出更多的设计和实现细节。 该JEP是JDK-8220715 (“向NullPointerException添加详细消息,描述什么为null”)及其“摘要”状态,“开发或维护Java应用程序时经常遇到NullPointerExceptions。 NullPointerExceptions通常不包含消息。 这使查找异常原因变得复杂。 该JEP建议增强异常文本,以告知什么为空以及哪个操作失败。”

JEP JDK-8220715还提供了未明确提供NPE消息时所建议的基本算法的详细描述。 文字指出,在示例中抛出NullPointerException时,“原始Java代码不可用”,但该信息仍“存储在异常对象的'backtrace'字段中”,该字段是“ jvm实施。”

JEP JDK-8220715强调“计算此处提出的NullPointerException消息是相当大的开销”,但是通过提出“延迟计算消息直到实际访问消息”来解决该问题。 换句话说,仅当实例化NullPointerException时未提供显式消息时,才计算“默认” NPE消息。

JEP JDK-8220715的“替代方案”部分指出:“当前的提议是在Java运行时中以C ++的方式实现这一点,直接访问元空间中的可用数据结构。” 本节考虑了该方法的一些替代方法(例如,通过诸如StackWalker之类的JDK库来实现),并说明了为什么建议的方法可能比该方法更可取。

有关与建议的NullPointerException消息增强功能相关的更多背景详细信息,请参见OpenJDK core-libs-dev邮件列表 。 以下是该讨论中的一些帖子,每篇帖子都摘录了一些有趣的内容:

  • Goetz Lindenmaier :“…从Java 5开始,我们的内部VM报告详细的空指针异常消息。 我想将此功能贡献给OpenJDK。 …消息是通过解析字节码生成的。 为了在分配NPE时没有任何开销,仅在通过getMessage()或序列化访问消息时才生成该消息。 为此,我在NPE上添加了一个字段,以指示仍需要延迟计算消息。”
  • Christoph Langer :“……感谢您最终将其引入OpenJDK。 我知道有人会对这个功能很满意。”
  • 彼得·勒瓦特(Peter Levart) :“确保将NPE_MESSAGE_PENDING初始化为新的String(“ something”),否则您可能会通过字符串interning与其他人共享此常量引用……”
  • 安德鲁·迪恩(Andrew Dinn) :“此外,如果您希望消息反映出发生异常时实际正在使用的字节码,那么您确实需要通过从方法元数据中提取字节码来做到这一点。 JvmtiClassFileReconstitutor返回的字节码将不包括由ClassFileTransformer安装的任何字节码更改。 但是,这可能是蠕虫病毒的潜在威胁,因为方法的旧版本和新版本以及关联的字节码可以同时存在。 您需要确定方法的哪个版本,以及由此产生异常的字节码。 如果您试图通过调用JVM从Java做到这一点,那么我认为您将会遇到问题。”
  • Goetz Lindenmaier :“最初的实现是C ++,并在发生异常的位置使用给定方法*和BCI遍历元空间。 因此,它仅使用内存中已经存在的数据。 请参阅jvm.cpp中的JVM_GetExtendedNPEMessage()。 想法是使用StackWalker和ASM在Java中实现这一点。 如果我有正确的字节码和正确的起点,ASM将有助于实现我认为的分析。”
  • Mandy Chung :“我们都认为改善NPE消息是对该平台的有用增强,并有助于开发人员确定NPE的产生原因。 ……这将引发有关提案功能的讨论,然后再讨论在VM,库或组合中实现该功能的最佳方法。”
  • Maurizio Cimadamore :“……此增强功能将是对我们平台的重要补充……我也认为,这种增强功能的设计空间并不平凡,最好在一种非媒介的介质中进行探索(并捕获!)。补丁。”
  • Goetz Lindenmaier :“…消息的措辞更好……尤其是对前几条消息,他们指出了此更改的有用性。 他们恰好说了一连串的取消引用是无效的。”
  • Maurizio Cimadamore :“…请找到随附的基于ASM的补丁。 它只是一个PoC,因此它不能提供与RFE / JEP中讨论的消息一样细的消息,但是可以进行增强以涵盖自定义调试属性……”

主题中还有许多其他帖子,上面的帖子是讨论的示例。

具有与NPE相关的更好的“默认”信息将是一个受欢迎的补充。 JDK-8218628当前与JDK 13相关联,但是由于现在存在JDK-8220715 ,因此可能不确定与JDK 13相关联。为此已编写了JEP草案 。

翻译自: https://www.javacodegeeks.com/2019/03/nullpointerexception-messages-coming-java.html

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

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

相关文章

什么是工业光纤环网交换机?

环网交换机就是可以组建环形网络的交换机&#xff0c;与其他类型交换机相比&#xff0c;具有稳定、自愈时间段等优点。每个环网交换机上有两个用于组环的端口&#xff0c;交换机之间通过手拉手形式构成了环形的网络拓扑。此外&#xff0c;环网交换机采用了某些特殊技术&#xf…

[渝粤教育] 苏州大学文正学院 网络互联技术与实践 参考 资料

教育 -网络互联技术与实践-章节资料考试资料-苏州大学文正学院【】 计算机网络互联设备随堂测验 1、【单选题】网桥处理的是 A、脉冲信号 B、MAC 帧 C、IP 包 D、ATM 包 参考资料【 】 2、【单选题】交换机工作在 OSI 七层的哪一层 A、一层 B、二层 C、三层 D、三层以上 参考资…

什么是工业级交换机?工业交换机作用有哪些?

最近有很多朋友来问我&#xff0c;什么是工业级交换机&#xff0c;跟商用交换机有什么区别。今天&#xff0c;咱们在这里具体来介绍下什么是工业交换机。工业交换机&#xff0c;即应用于工业控制领域的以太网交换机设备&#xff0c;无论是在性能还是作用方面都与普通交换机有很…

[渝粤教育] 西北大学 数据结构 参考 资料

教育 -数据结构-章节资料考试资料-西北大学【】 数据结构的基础概念随堂测验 1、【单选题】一个抽象类型包括数据对象、 和一组处理数据的操作。 A、数据对象中各元素间的结构关系 B、数据元素集 C、接口 D、数据对象集 参考资料【 】 2、【填空题】抽象数据类型具有 、信息隐蔽…

Spring Boot CommandLineRunner和ApplicationRunner

在本快速教程中&#xff0c;我们将探索Spring Boot中两个非常流行的界面&#xff1a; CommandLineRunner和ApplicationRunner 。 这些接口的一种常见用例是在应用程序启动时加载一些静态数据。 虽然&#xff0c;我看到这种用法主要用于测试数据设置。 它们都是带有run&#x…

visualvm远程jvm_如何使用VisualVM监视服务器上的多个JVM

visualvm远程jvm在上一篇文章中&#xff0c;我向您展示了如何使用单个管理员服务器和多个托管服务器启动WebLogic Server。 这些启动之后&#xff0c;您如何检查它们的健康状况&#xff1f; 您可以使用管理员的/ console网络应用。 但是&#xff0c;所有默认Oracle / Open JDK …

[渝粤教育] 西南石油大学 岩体力学 参考 资料

教育 -岩体力学-章节资料考试资料-西南石油大学【】 第一章测试 1、【单选题】大部分岩体属于&#xff08; &#xff09;。 A、均质连续材料 B、非均质材料 C、非连续材料 D、非均质、非连续、各向异性材料 参考资料【 】 2、【单选题】岩石的弹性模量一般指&#xff08; &…

如何区别标准POE交换机和非标POE交换机

通俗的说&#xff0c;POE交换机就是支持网线供电的交换机&#xff0c;其不但可以实现普通交换机的数据传输功能还能同时对网络终端进行供电。那么&#xff0c;我们该如何来区别如何区别标准POE交换机和非标POE交换机呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细看看…

[渝粤教育] 西安电子科技大学 工程制图与计算机绘图 参考 资料

教育 -工程制图与计算机绘图-章节资料考试资料-西安电子科技大学【】 *****单元测验–国家制图标准的基本规定 1、【单选题】绘图比例包括原值、放大比例、缩小比例&#xff0c;优先选择&#xff1a; A、原值 B、缩小比例 C、放大比例 D、无所谓 参考资料【 】 2、【单选题】细…

Spring Boot退出代码–创建自定义退出代码

当运行Spring Boot应用程序时&#xff0c;一切正常&#xff0c;我们将获得系统退出代码0 。 对于任何未处理的异常&#xff0c;应用程序将返回退出代码1 。 我们有可能从Spring Boot应用程序返回自定义退出代码。 在本教程中&#xff0c;我们将学习如何做。 实现 让我们从创建…

[渝粤教育] 郑州升达经贸管理学院 大学英语混合式课程 参考 资料

教育 -大学英语混合式课程-章节资料考试资料-郑州升达经贸管理学院【】 Quiz 1、【多选题】According to the clip, what are the major sources of the English words?(从电影中&#xff0c;你了解到英语词汇主要来自于哪些语言&#xff1f;) A、Latin B、Japanese C、Greek …

如何挑选一款合适的POE工业级交换机?

由于工业级交换机能够耐受各种比较苛刻的作业环境&#xff0c;而且产品系列多&#xff0c;端口装备灵敏&#xff0c;能够满足各种工业操控范畴的运用需求&#xff0c;因此在电力、冶金、石化、环保、交通、建筑等行业领域应用非常的广泛&#xff0c;各行各业信息化的建造对工业…

建设IPTV电视系统是否有必要?

随着信息化、智能化时代的发展&#xff0c;传统意义上的竞争方式和经营管理模式都在经营变革&#xff0c;建设IPTV电视系统及方案是否有必要&#xff1f; 下面我们先以几个场所为例&#xff0c;看看建设IPTV电视系统到底有什么用&#xff1f; 酒店 统一前端管理&#xff0c;方…

[渝粤教育] 郑州航空工业管理学院 航空概论 参考 资料

教育 -航空概论-章节资料考试资料-郑州航空工业管理学院【】 第1部分单元作业 第1部分单元测验 1、【单选题】航空是指载人或不载人的飞行器在地球 的航行活动。 A、高空 B、大气层内 C、宇宙 D、大气层外 参考资料【 】 2、【单选题】轻于空气的航空器靠 升空。 A、与空气相对…

高效的企业测试-工作流和代码质量(4/6)

本文的这一部分将讨论在开发过程中拥有有效工作流程的影响&#xff0c;以及适当的测试代码质量如何使我们能够创建可维护的测试&#xff0c;尤其是对于复杂项目。 开发工作流程和管道 编程是一项流程活动&#xff0c;我们开发人员应该对保持工作流程高效和缩短周转时间感兴趣…

飞畅科技-图解交换机接口及连接方式

局域网交换机作为局域网的集中连接设备&#xff0c;它的接口类型是随着各种局域网和传输介质类型的发展而变化的&#xff0c;交换机的许多接口与路由器接口完全一样。接下来就由杭州飞畅的小编来为大家介绍下交换机的接口类型以及连接方式有哪些&#xff1f;一起来看看吧&#…

[渝粤教育] 重庆工业职业技术学院 汽车安全与舒适系统维修 参考 资料

教育 -汽车安全与舒适系统维修-章节资料考试资料-重庆工业职业技术学院【】 认识汽车数据总线系统 1、【单选题】开发CAN总线的公司是 A、西门子 B、摩托罗拉 C、BOSCH D、爱立信 参考资料【 】 2、【单选题】本地内部连接网络&#xff0c;又称“局域子系统”的英文缩写是 A、L…

什么是有线电视系统?有线电视系统的组成部分是什么?

有线电视是通过同轴电缆、光缆为主要传输媒介&#xff0c;向用户传送本地、远地及自办节目的电视广播数据通信系统。有线电视既可以传输模拟电视信号也可以用来传输数字电视信号。 有线电视系统主要由信号源、前端部分、干线传输部分和分配部分组成。 1、信号源接收部分&…

分而治之_编写干净的测试–分而治之

分而治之好的单元测试应该仅出于一个原因而失败。 这意味着适当的单元测试仅测试一个逻辑概念。 如果我们要编写干净的测试&#xff0c;则必须识别那些逻辑概念&#xff0c;并且每个逻辑概念只编写一个测试用例。 这篇博客文章描述了我们如何识别从测试中发现的逻辑概念&…

[渝粤教育] 长沙航空职业技术学院 液压与气动技术 参考 资料

教育 -液压与气动技术-章节资料考试资料-长沙航空职业技术学院【】 随堂测-液压传动原理 1、【单选题】液压传动是以液体的&#xff08; &#xff09;能来传递动力的。 A、化学能 B、动能 C、势能 D、压力能 参考资料【 】 2、【单选题】液压传动是以&#xff08; &#xff09;…