Java 14 來勢洶洶,這回讓空指針無處遁形!!

上篇:Java 14 之模式匹配,很是讚的一個新特性!java

相信在坐的每一位 Java 程序員都遇到過空指針異常: NullPointerException(NPE),不甚其煩。程序員

棧長以前也分享幾篇避免空指針的文章:面試

空指針異常神鬼莫測,它幾乎能夠出如今程序中的任何位置,想嘗試捕獲處理是不太切實際的。後端

背景

咱們通常要經過 JVM 異常報告的代碼位置去處理,JVM 會打印出致使空指導異常的詳細類名、方法名以及行號,如如下異常所示:安全

Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:3)

很顯然,Test 類的 main 方法第 3 行發生了空指針異常,若是第 3 行的代碼是:微信

javastack.name = '棧長';

這時候咱們確定能斷定 javastack 對象爲 null,若是是下面這段呢:多線程

javastack.name = params.user.name;

如下這 e 個對象均可能爲空:架構

  • javastack
  • params
  • user

這時候就沒法經過 JVM 報告的位置所斷定究竟是哪一個變量爲空了,每個對象均可能是空指針的入口,只能經過輸出日誌或者 Debug 調試去跟蹤了。工具

若是 JVM 能夠提供足夠明確的信息以顯示空指針異常的具體來源,而無需額外的代碼、工具來定位,那麼這對開發人員、或者線上問題定位都舉足輕重。固然,這個在商業 JVM 早就作到了,Java 14,它如今也終於來了。性能

詳細的空指針異常信息

詳細能夠看官方這篇介紹:

https://openjdk.java.net/jeps...
Exception in thread "main" java.lang.NullPointerException: 
        Cannot read field "name" because "params.user" is null
    at Test.main(Test.java:3)

如上所示,會給出詳細的發生空指針異常變量路徑。

另外,若是是下標式訪問的賦值語句,如 a[i][j][k] = 2020; 拋出空指針,那會是這樣的:

Exception in thread "main" java.lang.NullPointerException:
        Cannot load from object array because "a[i][j]" is null
    at Test.main(Test.java:18)

注意:在同一行上顯示異常類型、異常消息會致使行很長,因此爲了保持可讀性,會在第二行顯示詳細異常信息。

另外,這個功能在 Java 14 默認狀況下是不開啓的,能夠使用如下 JVM 參數進行切換:

開啓:-XX:+ShowCodeDetailsInExceptionMessages

關閉:-XX:-ShowCodeDetailsInExceptionMessages

爲何如今默認不開啓?

1)性能

若是應用程序頻繁地拋出並打印異常堆棧消息,勢必會帶來必定的開銷、影響性能,因此應儘可能避免這種開銷。

2)安全

這個會致使更多源代碼的暴露,若是這個不能接受,則不該由 JVM 配置應用程序打印,而應捕獲並丟棄。

3)兼容性

過去的 JDK 都是不打印詳細空指針異常信息的,JVM 相關工具要依賴於異常消息的準確格式,有可能會存在兼容性問題。

因此,這個特性暫時默認是關閉的,在將來不久的版本中會默認開啓。

好了,今天就到這了,關注微信公衆號:Java技術棧,新特性實戰陸續更新中,公衆號第一時間推送。歷史 Java 8 - 14 新特性教程能夠在公衆號回覆 java 獲取。

棧長原創和整理不易,以爲文章不錯,在看、轉發分享給更多的朋友們,總能幫助有須要的人,你們一塊兒流弊~

推薦去個人博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、後端、架構、阿里巴巴等大廠最新面試題

以爲不錯,別忘了點贊+轉發哦!

相關文章
相關標籤/搜索