欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java14對(duì)于NullPointerException的新處理方式示例解析

 更新時(shí)間:2023年09月12日 10:59:53   作者:Java后端技術(shù)  
這篇文章主要為大家介紹了Java14對(duì)于NullPointerException的新處理方式示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

最近新出的Java14,相信大家有所耳聞,面對(duì)NullPointerException,Java14有哪些更好的處理方式呢?

1、傳統(tǒng)的NullPointerException

在編碼過程中,經(jīng)常會(huì)用到鏈?zhǔn)降恼{(diào)用方式來寫代碼,方便清晰,但是一旦出現(xiàn)NullPointerException,就頭大了。因?yàn)楹茈y知道異常在什么時(shí)候發(fā)生。舉個(gè)例子:

String city = employe.getDetailInfo().getAddress().getCity();

在鏈?zhǔn)秸{(diào)用過程中,如果 employee,getDetailInfo(),或者getAddress()為空,JVM就會(huì)拋出NullPointerExeption,那么導(dǎo)致異常的根本原因是什么?如果不使用調(diào)試器,我們很難確認(rèn)哪個(gè)變量為空。而JVM也只會(huì)打印導(dǎo)致異常的方法、文件名和行號(hào)。

2、增強(qiáng)型 NullPointerException

SAP在2006年為商業(yè)JVM實(shí)現(xiàn)了增強(qiáng)型的NullPointerException。2019年,被提議作為一個(gè)OpenJDK社區(qū)的增強(qiáng)。本質(zhì)上JEP 358通過描述某個(gè)變量是"null"來提高JVM生成"NullPointerException"的可讀性。通過在方法、文件名和行號(hào)旁邊描述為null的變量,帶來一個(gè)詳細(xì)的NullPointerException消息。通過分析程序的字節(jié)碼指令來工作,因此能夠準(zhǔn)確的定位到哪個(gè)變量或者表達(dá)式為null。

在Java14中,默認(rèn)是關(guān)閉詳細(xì)的異常消息的。

要啟用,需要配置:

-xx:+showCodeDeatilsInExceptionMessages

2.1 詳細(xì)的異常信息考慮在激活showCodeDeatilsInExceptionMessages標(biāo)志的情況下再次運(yùn)行代碼,從附加信息中,可以看到具體的空指針的類,來節(jié)省我們調(diào)試所用的時(shí)間。

JVM有兩部分組成詳細(xì)的異常信息,第一部分表示失敗的操作,是引用為null的結(jié)果,第二部分標(biāo)識(shí)了null引用的原因

Cannot invoke "String.toLowerCase()" because the return value of "getEmailAddress()" is null

為了生成異常信息,JEP 358重構(gòu)了將空引用推送到操作數(shù)堆棧上的部分源碼。

3 技術(shù)方面

只有當(dāng)JVM本身拋出"NullPointerException"時(shí),才會(huì)進(jìn)行詳細(xì)的消息計(jì)劃,如果我們?cè)诖a中顯示拋出異常,則不會(huì)執(zhí)行計(jì)算。原因:在這些情況下,很可能已經(jīng)在異常構(gòu)造函數(shù)中傳遞了一條有意義的消息。

其次,JEP 358懶漢式的計(jì)算消息,這意味著只有當(dāng)我們打印異常消息的時(shí)候,才調(diào)用增強(qiáng)的NullPointerException,而不是當(dāng)異常發(fā)生時(shí)就調(diào)用。因此對(duì)于通常的JVM流程不應(yīng)該有任何性能影響。

最后,詳細(xì)的異常信息可能包含源代碼中的局部變量名。因此我們認(rèn)為這是一個(gè)潛在的安全風(fēng)險(xiǎn)。但是只有運(yùn)行使用激活的-G標(biāo)記編譯的代碼時(shí),才會(huì)發(fā)生這樣的情況。

Employee employee = null;
employee.getName();

執(zhí)行以上代碼時(shí),異常信息中會(huì)打印本地變量名稱:

"com.xxx.xxx.xxx$Employee.getName()"
because "employee" is null

相反,沒有額外調(diào)試信息的情況下,JVM只提供他在詳細(xì)信息中所知道的變量

Cannot invoke
 "com.xxx.xxx.xxx$Employee.getName()"
because "<locall>" is null

JVM打印編譯器分配的變量索引,而不是本地變量名(employee)

通過Java14增強(qiáng)型的NullPointerException,我們可以很快定位出代碼問題所在,更快的調(diào)試代碼,提高效率。

以上就是Java14對(duì)于NullPointerException的新處理方式示例解析的詳細(xì)內(nèi)容,更多關(guān)于Java NullPointerException的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JAVA springboot如何開啟倆端口

    JAVA springboot如何開啟倆端口

    這篇文章主要介紹了JAVA springboot如何開啟倆端口問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Spring獲取管理對(duì)象常用方法詳解

    Spring獲取管理對(duì)象常用方法詳解

    這篇文章主要介紹了Spring獲取管理對(duì)象常用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 詳解MyBatis自定義Plugin插件

    詳解MyBatis自定義Plugin插件

    這篇文章主要介紹了MyBatis自定義Plugin插件的相關(guān)知識(shí),實(shí)現(xiàn)方法也很簡(jiǎn)單,只需實(shí)現(xiàn) Interceptor 接口,并指定想要攔截的方法簽名即可,需要的朋友可以參考下
    2018-06-06
  • 使用Spring從YAML文件讀取內(nèi)容映射為Map方式

    使用Spring從YAML文件讀取內(nèi)容映射為Map方式

    這篇文章主要介紹了使用Spring從YAML文件讀取內(nèi)容映射為Map方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Spring?Boot?集成Redisson實(shí)現(xiàn)分布式鎖詳細(xì)案例

    Spring?Boot?集成Redisson實(shí)現(xiàn)分布式鎖詳細(xì)案例

    這篇文章主要介紹了Spring?Boot?集成Redisson實(shí)現(xiàn)分布式鎖詳細(xì)案例,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • springboot自定義異常視圖過程解析

    springboot自定義異常視圖過程解析

    這篇文章主要介紹了springboot自定義異常視圖過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Spring Boot配置讀取實(shí)現(xiàn)方法解析

    Spring Boot配置讀取實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Spring Boot配置讀取實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 淺談maven的jar包和war包區(qū)別 以及打包方法

    淺談maven的jar包和war包區(qū)別 以及打包方法

    下面小編就為大家分享一篇淺談maven的jar包和war包區(qū)別 以及打包方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-11-11
  • GraalVM和Spring Native嘗鮮一步步讓Springboot啟動(dòng)飛起來66ms完成啟動(dòng)

    GraalVM和Spring Native嘗鮮一步步讓Springboot啟動(dòng)飛起來66ms完成啟動(dòng)

    GraalVM是高性能的JDK,支持Java/Python/JavaScript等語言,它可以讓Java變成二進(jìn)制文件來執(zhí)行,讓程序在任何地方運(yùn)行更快,這篇文章主要介紹了GraalVM和Spring Native嘗鮮一步步讓Springboot啟動(dòng)飛起來66ms完成啟動(dòng),需要的朋友可以參考下
    2023-02-02
  • SpringBoot中Bean生命周期自定義初始化和銷毀方法詳解

    SpringBoot中Bean生命周期自定義初始化和銷毀方法詳解

    這篇文章給大家詳細(xì)介紹了SpringBoot中Bean生命周期自定義初始化和銷毀方法,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01

最新評(píng)論