jdk8 npe_JDK 14中更好的NPE消息
jdk8 npe
我的2019年3月博客文章“ Java會出現(xiàn)更好的默認(rèn)NullPointerException消息嗎? ”的撰寫是為了獲得更好的NullPointerException消息的JEP 草案尚未針對特定的JDK版本。 此后,該JEP草案成為JEP 14的 目標(biāo) JEP 358(“ Helpful NullPointerExceptions”) 。 更好的是,初始實(shí)現(xiàn)( JDK-8218628 ) 已經(jīng)在JDK 14分支中 ,并且可以在JDK 14 Early Access Builds Build 20(2019/10/23)中使用 。
在本文中,我將針對JDK 14 Early Access Build 20運(yùn)行先前文章中介紹的示例代碼 ,以演示現(xiàn)在提供的其他詳細(xì)信息。 要查看為故意引入導(dǎo)致NullPointerException的各種情況而編寫的示例代碼,請參閱前面的文章或查看GitHub上的源代碼 。
下載JDK 14 Early Access Build 20并按其路徑指向該文件后,運(yùn)行java -version時會看到以下內(nèi)容:
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之后 ,我重新構(gòu)建了前面提到的源代碼 ,然后使用Java啟動器重新運(yùn)行了該代碼,而沒有任何新選項。 該輸出(如下所示)與先前JDK版本的輸出沒有實(shí)質(zhì)性差異。
========================================= | # | # 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,當(dāng)我正常運(yùn)行應(yīng)用程序時,也看不到有關(guān)NullPointerException的任何新的詳細(xì)信息。 我包含了此輸出,以表明需要一個特殊的標(biāo)志來啟用更詳細(xì)的NullPointerException ,并使比較不帶額外細(xì)節(jié)的輸出更加方便。 下一個輸出清單顯示了將Java啟動器傳遞給標(biāo)志-XX:+ShowCodeDetailsInExceptionMessages時提供的其他詳細(xì)信息:
========================================= | # | # 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解釋了如何使用此標(biāo)志查看其他NullPointerException詳細(xì)信息:“可以使用新的boolean命令行選項-XX { + | - } ShowCodeDetailsInExceptionMessages -XX { + | - } ShowCodeDetailsInExceptionMessages 。 該選項將首先具有默認(rèn)值' false ',以便不打印消息。 它旨在在以后的版本中默認(rèn)情況下在異常消息中啟用代碼詳細(xì)信息。” 如我們所見,此功能默認(rèn)情況下最初處于關(guān)閉狀態(tài),但是有計劃在將來啟用更詳細(xì)的NullPointerException消息。
最近的一條Tweet提出了一個問題:“如果字節(jié)碼不包含變量名,它將如何工作?” 這個問題通過提供一個具體的例子來繼續(xù):“假設(shè)我們有像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哪種消息?” 盡管前面顯示的一系列測試中都包含了一個示例,但我認(rèn)為我會在此處針對該問題提供更集中的示例。 下一個代碼清單(也在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啟動器標(biāo)志-XX:+ShowCodeDetailsInExceptionMessages運(yùn)行此簡單應(yīng)用程序的結(jié)果。
如屏幕快照所示,在JDK 14 Early Access Build 20中使用-XX:+ShowCodeDetailsInExceptionMessages標(biāo)志可提供與此簡單NullPointerException示例相關(guān)的其他詳細(xì)信息:“無法調(diào)用” dustin.examples.npe.TwoDoubleWhiskeyTweetExample $ Person.getName() ”,因為“ <local1> ”為空”
GitHub上提供了一個更簡單,甚至更接近Tweet-ed問題中提供的原始示例的示例。
JEP 358 (“ 有用的NullPointerExceptions ”)可能不像新JDK版本中的其他一些JEP那樣浮華,但最終可能是每天為Java開發(fā)人員提供的價值要比其一些浮華的同行更高。 有許多示例將對您有所幫助,JEP本身以及本文引用的我的代碼示例中都闡明了許多示例情況。
翻譯自: https://www.javacodegeeks.com/2019/10/better-npe-messages-in-jdk-14.html
jdk8 npe
總結(jié)
以上是生活随笔為你收集整理的jdk8 npe_JDK 14中更好的NPE消息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站后台怎么制作(网站后端怎么做)
- 下一篇: 常见的并发模型_两个常见的并发错误