萬惡的NPE如何避免,幾種你必須知道的方案!!!

前言

  • 空指針異常在開發中可謂是防不勝防,對於這類異常,預防勝於治療。那麼如何能夠有效的預防呢?今天陳某來聊一聊如何預防空指針的異常。

什麼是空指針?

  • 當一個變量的值爲 null 時,在 Java 裏面表示一個不存在的空對象,沒有實際內容,沒有給它分配內存,null 也是對象成員變量的默認值。

  • 所以,一個對象如果沒有進行初始化操作,這時候,如果你調用這個對象的方法或者變量,就會出現空指針異常。

  • 如下面示例會發生空指針異常:

Object object = null;
String string = object.toString();
  • 關於異常的分類,什麼是運行時異常,什麼是編譯時異常,這裏不再贅述,未了解的朋友可以查閱相關的文章,這個在初級面試中還是比較常問的一類問題。

如何避免空指針異常?

  • 下面說說幾個預防空指針的方案。

字符串比較,常量放在前面

  • 對於初級開發者這是個最常見的坑,老司機基本都知道,示例如下:

if(status.equals("success")){

}
  • 上述代碼中,如果status爲null將會拋出空指針異常,一種避免的方法就是將常量放在前面,如下:

if("success".equals(status)){

}

使用null安全的方法庫

  • 作爲Java開發者,用的最多的就是Apache的StringUtils,其中的許多方法使用很方便並且不用擔心空指針異常,比如StringUtils.isBlank(),isNumeric(),isWhiteSpace()。

初始化默認值

  • 在給對象初始化的時候給他一個默認值或者默認的構造實現,如下:

User user = new User();
String name = StringUtils.EMPTY;

返回空集合

  • 在返回集合的時候如果是null,統一默認返回一個空集合,如下:

public List getUserList(){
    List list = userMapper.gerUserList();
    return list == null ? new ArrayList() : list;
}
  • 此時方法調用者將不會擔心空指針異常了。

斷言

  • 斷言是用來檢查程序的安全性的,在使用之前進行檢查條件,如果不符合條件就報異常,符合就繼續。

  • Java 中自帶的斷言關鍵字:assert,如:

assert name == null : "名稱不能爲空";
  • 除了Java自帶的斷言,可以使用一些方便的開源庫或者自己實現,具體根據開發要求。

Optional

  • Optional 是 JDK 8 新增的新特性,再也不用 != null 來判斷了,這個在一個對象裏面的多個子對象連續判斷的時候非常有用。

  • Optional非常強大,想要熟練的使用還是要下一番功夫的,篇幅較大,這裏不再細說,想了解的朋友可以查閱相關的文章,這裏簡單的舉個例子,如下:

String version = computer.flatMap(Computer::getSoundcard)
     .flatMap(Soundcard::getUSB)
     .map(USB::getVersion)
     .orElse("UNKNOWN");

避免你的代碼中不必要的自動包裝和自動解包

  • 不管其他如創建臨時對象的缺點,如果wrapper類對象是null,自動包裝同樣容易導致空指針異常。例如如果person對象沒有電話號碼的話會返回null,如下代碼會因爲空指針異常崩潰。

Person ram = new Person("ram");
int phone = ram.getPhone();
  • 當使用自動包裝和自動解包的時候,不僅僅是等號,< > 同樣會拋出空指針異常。你可以通過這篇文章來學習更多的Java中的自動包裝和拆包的陷阱。

定義數據庫中的字段是否可爲空

  • 作爲Java開發者,一切的業務都離不開數據庫,表中的字段定義不允許爲null能夠有效的避免代碼中的空指針異常。

總結

  • 本篇文章講了在實際開發中避免空指針的幾種切實可行的幾種方法,喜歡的朋友們點點在看,歡迎轉發,謝謝支持!!!

往期推薦

一文搞定分佈式系統ID生成方案這是我看過關於 volatile 最好的文章

幹掉可惡的  "try catch "!

看完這篇接口限流,又能和麪試官扯皮了~面試官:Spring 用了哪些設計模式?說三種即可 = =

Intellij idea 2020永久破解,親測可用!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章