這幾天研究了一下JDK14,發(fā)現(xiàn)它處理NPE的方式,真香!
來源:鍋外的大佬
傳統(tǒng)的 NullPointerException
舉個(gè)簡單的例子,就比如下面的代碼,要找到公司某個(gè)員工的戶籍所在地,我們這樣來調(diào)用
String city = employee.getDetailInfos().getRegistryAddress().getCity();增強(qiáng)型 NullPointerException
本質(zhì)上,JEP 358 旨在通過描述某個(gè)變量是 “null” 來提高 JVM 生成的 “NullPointerException” 的可讀性。JEP 358通過在方法、文件名和行號旁邊描述為 null 的變量,帶來了一個(gè)詳細(xì)的 NullPointerException 消息。它通過分析程序的字節(jié)碼指令來工作。因此,它能夠精確地確定哪個(gè)變量或表達(dá)式是null。最重要的是,JDK 14中默認(rèn)關(guān)閉詳細(xì)的異常消息。要啟用它,我們需要使用命令行選項(xiàng):
-XX:+ShowCodeDetailsInExceptionMessagesException in thread "main" java.lang.NullPointerException: Cannot invoke "RegistryAddress.getCity()" because the return value of"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$DetailInfos.getRegistryAddress()" is null at com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException.main(HelpfulNullPointerException.java:10)JVM由兩部分組成詳細(xì)的異常消息。第一部分表示失敗的操作,這是引用為 *null* 的結(jié)果,而第二部分標(biāo)識了 *null* 引用的原因:
Cannot invoke "String.toLowerCase()" because the return value of "getEmailAddress()" is null技術(shù)方面
最后,詳細(xì)的異常消息可能包含源代碼中的局部變量名。因此,我們可以認(rèn)為這是一個(gè)潛在的安全風(fēng)險(xiǎn)。但是,只有在運(yùn)行使用激活的 -g 標(biāo)記編譯的代碼時(shí),才會發(fā)生這種情況,該標(biāo)記會生成調(diào)試信息并將其添加到類文件中。請考慮一個(gè)簡單的示例,我們已編譯該示例以包含以下附加調(diào)試信息:
Employee employee = null;employee.getName();"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()"because "employee" is null相反,在沒有額外調(diào)試信息的情況下,JVM 只提供它在詳細(xì)消息中所知道的變量:
Cannot invoke"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()"because "<local1>" is nullJVM 打印編譯器分配的變量索引,而不是本地變量名(employee)。
正文結(jié)束
1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵志故事
3.從零開始搭建創(chuàng)業(yè)公司后臺技術(shù)棧
5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...
一個(gè)人學(xué)習(xí)、工作很迷茫?
點(diǎn)擊「閱讀原文」加入我們的小圈子!

