前言
空指針異常在開發中可謂是防不勝防,對於這類異常,預防勝於治療。那麼如何能夠有效的預防呢?今天陳某來聊一聊如何預防空指針的異常。
什麼是空指針?
當一個變量的值爲 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 最好的文章
看完這篇接口限流,又能和麪試官扯皮了~面試官:Spring 用了哪些設計模式?說三種即可 = =