1.傳統(tǒng)的 NullPointerException
2.增強型 NullPointerException
2.1 詳細的異常信息
3. 技術(shù)方面
在Java語言中,處理空指針往往是一件很頭疼的事情,一不小心,說不定就搞出個線上Bug,讓你的績效考核拿到3.25。
最近新出的Java14,相信大家都有所耳聞,那么今天就來看看,面對NullPointerException,Java14有哪些更好的處理方式呢?
1.傳統(tǒng)的 NullPointerException
我們編碼過程中呢,經(jīng)常會使用鏈式調(diào)用的方式來寫代碼,這樣寫起來很方便,也很清晰,但是,一旦出現(xiàn)NullPointerException,那就頭大了,因為你很難知道異常是在什么時候開始發(fā)生的。
舉個簡單的例子,就比如下面的代碼,要找到公司某個員工的戶籍所在地,我們這樣來調(diào)用
Stringcity=employee.getDetailInfos().getRegistryAddress().getCity();
在鏈式調(diào)用的過程中,如果employee, getDetailInfos(),或者 getRegistryAddress() 為空,JVM就會拋出 NullPointerException
那么導致異常的根本原因是什么?如果不使用調(diào)試器,很難確定哪個變量為空。而且,JVM也只會打印導致異常的方法、文件名和行號,僅此而已。那么下面,我將帶大家了解Java 14如何通過 JEP 358 解決這個問題。
2.增強型 NullPointerException
SAP在2006年為其商業(yè)JVM實現(xiàn)了增強型的 NullPointerException。2019年2月,它被提議作為OpenJDK社區(qū)的一個增強,之后很快,它成為了一個JEP。所以,該功能在2019年10月完成并在JDK 14版本推出 。
本質(zhì)上,JEP 358 旨在通過描述某個變量是 “null” 來提高 JVM 生成的 “NullPointerException” 的可讀性。JEP 358通過在方法、文件名和行號旁邊描述為 null 的變量,帶來了一個詳細的 NullPointerException 消息。它通過分析程序的字節(jié)碼指令來工作。因此,它能夠精確地確定哪個變量或表達式是null。最重要的是,JDK 14中默認關(guān)閉詳細的異常消息 。要啟用它,我們需要使用命令行選項:
-XX:+ShowCodeDetailsInExceptionMessages
2.1 詳細的異常信息
考慮在激活 ShowCodeDetailsInExceptionMessages 標志的情況下再次運行代碼:
Exceptioninthread"main"java.lang.NullPointerException: Cannotinvoke"RegistryAddress.getCity()"becausethereturnvalueof "com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$DetailInfos.getRegistryAddress()"isnull atcom.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException.main(HelpfulNullPointerException.java:10)
這一次,從附加信息中,我們知道員工的個人詳細信息丟失的注冊地址導致了我們的異常。從這個增強中獲得的信息可以節(jié)省我們調(diào)試所用的時間。
JVM由兩部分組成詳細的異常消息。第一部分表示失敗的操作,這是引用為 *null* 的結(jié)果,而第二部分標識了 *null* 引用 的原因:
Cannotinvoke"String.toLowerCase()"becausethereturnvalueof"getEmailAddress()"isnull
為了生成異常消息,JEP 358 重構(gòu)了將空引用推送到操作數(shù)堆棧上的部分源代碼。
3. 技術(shù)方面
現(xiàn)在我們已經(jīng)很好地理解了如何使用增強的NullPointerExceptions標識 null 引用,讓我們來看看它的一些技術(shù)方面。
首先,只有當JVM本身拋出一個 NullPointerException 時,才會進行詳細的消息計算,如果我們在Java代碼中顯式拋出異常,則不會執(zhí)行計算。原因是因為:在這些情況下,很可能已經(jīng)在異常構(gòu)造函數(shù)中傳遞了一條有意義的消息。
其次,**JEP 358 ** 懶漢式地計算消息,這意味著只有當我們打印異常消息時才調(diào)用增強的NullPointerException,而不是當異常發(fā)生時就調(diào)用。因此,對于通常的JVM流程不應該有任何性能影響,在那里我們可以捕獲并重新拋出異常,因為咱并不會只想打印異常消息。
最后,詳細的異常消息可能包含源代碼 中的局部變量名。因此,我們可以認為這是一個潛在的安全風險。但是,只有在運行使用激活的 -g 標記編譯的代碼時,才會發(fā)生這種情況,該標記會生成調(diào)試信息并將其添加到類文件中。請考慮一個簡單的示例,我們已編譯該示例以包含以下附加調(diào)試信息:
Employeeemployee=null; employee.getName();
當執(zhí)行以上代碼時,異常信息中會打印本地變量名稱:
"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()" because"employee"isnull
相反,在沒有額外調(diào)試信息的情況下,JVM 只提供它在詳細消息中所知道的變量:
Cannotinvoke "com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()" because""isnull
JVM 打印編譯器分配的變量索引,而不是本地變量名(employee)。
關(guān)于NullPointerException的處理到這里就結(jié)束了,通過Java14增強的NullPointerException,我們可以很快速的定位代碼問題的原因所在,更快的調(diào)試代碼,節(jié)約時間,提高效率。
已經(jīng)安裝了Java14的朋友可以試試看哦~
-
JAVA
+關(guān)注
關(guān)注
20文章
2982瀏覽量
106387 -
編程
+關(guān)注
關(guān)注
88文章
3670瀏覽量
94614 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
70855 -
JVM
+關(guān)注
關(guān)注
0文章
159瀏覽量
12444
原文標題:Java14 處理 NullPointerException 新方式,真的太香了!
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
RK3399處理器與AR9201處理器有哪些不同之處呢
Sitara AM62處理器的資料分享
Cortex-A9處理器技術(shù)參考手冊
Intel 64位處理器,Intel 64位處理器結(jié)構(gòu)原理
蘋果a6處理器怎么樣_a6處理器參數(shù)
A14處理器性能已超酷睿i9處理器,意味著ARM超越Intel嗎?

A14處理器的性能超過酷睿i9處理器,ARM勝出一籌

評論