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
總結
以上是生活随笔為你收集整理的jdk8 npe_JDK 14中更好的NPE消息的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 网站后台怎么制作(网站后端怎么做)
 - 下一篇: ps怎么扣图出来(ps怎么抠图出来在粘贴