JDK 14的新特性:更加好用的NullPointerExceptionsjava
讓99%的java程序員都頭痛的異常就是NullPointerExceptions了。NullPointerExceptions簡稱NPE,它是運行時異常的一種,也是java程序中最最容易出現的異常。git
出現了NullPointerExceptions以後咱們怎麼處理呢?程序員
通常狀況下就是看日誌,看一下到底哪一行出錯了。若是這一行只有簡單的代碼,那麼很容易就找到問題所在。github
要命的是若是這一行很複雜,那麼找出問題就不是那麼容易了。頗有可能咱們須要向前debug100行,向後debug50行才能解決。安全
最大的問題就是若是這個異常出如今線上環境,debug是不可能debug了。這時候就要靠你的肉眼,你對程序的敏感程度再加上你的專業素養,才能從萬花叢中找出那個問題。性能
舉個例子,咱們定義一個CustUser和Address:spa
@Data public class CustUser { private String userName; private Address address; }
@Data public class Address { private String addressName; }
再來產生一個NPE:debug
@Slf4j public class NPEUsage { public static void main(String[] args) { Address address=new Address(); CustUser custUser=new CustUser(); custUser.setAddress(address); log.info(custUser.getAddress().getAddressName().toLowerCase()); } }
上面代碼中的最後一行,由於addressName是空的,因此在調用toLowerCase的時候會拋出NPE。運行結果以下:3d
Exception in thread "main" java.lang.NullPointerException at com.flydean.nullpointerexceptions.NPEUsage.main(NPEUsage.java:16)
上述異常只告訴咱們有一個NPE在第16行。可是16行有一長串代碼,究竟是哪裏報了這個異常呢?日誌
簡單代碼,好比上面咱們提的例子,簡單分析一下就知道問題所在了。可是對於那麼猶如蛛網同樣的複雜的項目,找起來就很難了。
別懼怕,JEP 358: Helpful NullPointerExceptions就是用來解決這個問題。
仍是上面的例子,仍是上面的配方和味道,咱們只須要在運行時加上下面的參數:
-XX:+ShowCodeDetailsInExceptionMessages
運行一下:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because the return value of "com.flydean.nullpointerexceptions.Address.getAddressName()" is null at com.flydean.nullpointerexceptions.NPEUsage.main(NPEUsage.java:16)
看到不一樣之處了嗎?完整的出錯信息被打印出來了。你苦思冥想的問題解決了。
這個特性好是好,可是默認狀況下是被關閉的。
有利就有弊,咱們看下這個參數有什麼影響:
本文的例子[https://github.com/ddean2009/...
](https://github.com/ddean2009/...
歡迎關注個人公衆號:程序那些事,更多精彩等着您!
更多內容請訪問 www.flydean.com