首頁 > Java > java教程 > Java如何避免出現NullPointerException的方法

Java如何避免出現NullPointerException的方法

黄舟
發布: 2017-09-07 10:31:11
原創
1713 人瀏覽過

這篇文章主要介紹了java 避免出現NullPointerException(空指標)的方法總結的相關資料,需要的朋友可以參考下

java 避免出現NullPointerException(空指標)的方法總結

Java應用程式中拋出的空指標例外是解決空指標的最佳方式,也是寫出能順利工作的健壯程式的關鍵。俗話說“預防勝於治療”,對於這麼令人討厭的空指針異常,這句話也是成立的。值得慶幸的是運用一些防禦性的編碼技巧,追蹤應用中多個部分之間的聯繫,你可以將Java中的空指針異常控制在一個很好的水平上。順便說一句,這是Javarevisited上的第二個空指標異常的貼文。在上個帖子中我們討論了Java中導致空指標異常的常見原因,而在本教程中我們將會學習一些Java的程式設計技巧和最佳實踐。這些技巧可以幫助你避免Java中的空指標異常。遵從這些技巧同樣可以減少Java程式碼中到處都有的非空檢查的數量。作為一個有經驗的Java程式設計師,你可能已經知道其中的一部分技巧並且應用在你的專案中。但對於新手和中級開發人員來說,這將是值得學習的。順便說一句,如果你知道其它的避免空指標異常和減少空指標檢查的Java技巧,請和我們分享。

這些都是簡單的技巧,很容易應用,但是對程式碼品質和健全性有顯著影響。根據我的經驗,只有第一個技巧可以顯著改善程式碼品質。如我之前所講,如果你知道任何避免空指針異常和減少空指針檢查的Java技巧,你可以透過評論本文來和分享。

1) 從已知的String物件呼叫equals()和equalsIgnoreCase()方法,而非未知物件。

總是從已知的非空String物件呼叫equals()方法。因為equals()方法是對稱的,呼叫a.equals(b)和呼叫b.equals(a)是完全相同的,這也是為什麼程式設計師對物件a和b這麼不上心。如果呼叫者是空指針,這種呼叫可能會導致一個空指針異常


Object unknownObject = null;

//错误方式 – 可能导致 NullPointerException
if(unknownObject.equals("knownObject")){
  System.err.println("This may result in NullPointerException if unknownObject is null");
}

//正确方式 - 即便 unknownObject是null也能避免NullPointerException
if("knownObject".equals(unknownObject)){
  System.err.println("better coding avoided NullPointerException");
}
登入後複製

這是避免空指針異常最簡單的Java技巧,但能夠導致巨大的改進,因為equals()是常見方法。

2) 當valueOf()和toString()傳回相同的結果時,寧願使用前者。

因為呼叫null物件的toString()會拋出空指標異常,如果我們能夠使用valueOf()得到相同的值,那寧願使用valueOf(),傳遞一個null給valueOf()將會傳回“null”,尤其是在那些包裝類,像Integer、Float、Double和BigDecimal。


BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //不会抛出空指针异常
System.out.println(bd.toString()); //抛出 "Exception in thread "main" java.lang.NullPointerException"
登入後複製

3) 使用null安全性的方法和函式庫 有許多開源程式庫已經為您做了繁重的空指標檢查工作。 其中最常用的一個的是Apache commons 中的StringUtils。你可以使用StringUtils.isBlank(),isNumeric(),isWhiteSpace()以及其他的工具方法而不用擔心空指標異常。


//StringUtils方法是空指针安全的,他们不会抛出空指针异常
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));

Output:
true
true
false
false
登入後複製

但是在做出結論之前,不要忘記閱讀空指標方法的類別的文件。這是另一個不需要下大功夫就能得到很大改進的Java最佳實踐。

4) 避免從方法傳回空指針,而是傳回空collection或空數組。

這個Java最佳實踐或技巧由Joshua Bloch在他的書Effective Java中提到。這是另外一個可以更好的使用Java程式設計的技巧。透過傳回一個空collection或空數組,你可以確保在呼叫如size(),length()的時候不會因為空指標異常崩潰。 Collections類別提供了方便的空List,Set和Map: Collections.EMPTY_LIST,Collections.EMPTY_SET,Collections.EMPTY_MAP。這裡是實例。


public List getOrders(Customer customer){
  List result = Collections.EMPTY_LIST;
  return result;
}
登入後複製

你同樣可以使用Collections.EMPTY_SET和Collections.EMPTY_MAP來取代空指標。

5) 使用annotation@NotNull 和@Nullable

在寫程式的時候你可以定義是否可為空指針。透過使用像@NotNull和@Nullable之類的annotation來宣告一個方法是否是空指標安全的。現代的編譯器、IDE或工具可以讀此annotation並幫你添加忘記的空指針檢查,或者向你提示出不必要的亂七八糟的空指針檢查。 IntelliJ和findbugs已經支援了這些annotation。這些annotation同樣是JSR 305的一部分,但即便IDE或工具中都沒有,這個annotation本身可以當作文件。看到@NotNull和@Nullable,程式設計師自己可以決定是否做空指標檢查。順便說一句,這個技巧對Java程式設計師來說相對比較新,要採用需要一段時間。

6) 避免你的程式碼中不必要的自動包裝和自動解包。

且不管其他如建立臨時物件的缺點,如果wrapper類別物件是null,自動包裝同樣容易導致空指標異常。例如如果person物件沒有電話號碼的話會回傳null,如下程式碼會因為空指標而異常崩潰。


Person ram = new Person("ram");
int phone = ram.getPhone();
登入後複製

当使用自动包装和自动解包的时候,不仅仅是等号,< > 同样会抛出空指针异常。你可以通过这篇文章来学习更多的Java中的自动包装和拆包的陷阱。

7) 遵从Contract并定义合理的默认值。

在Java中避免空指针异常的一个最好的方法是简单的定义contract并遵从它们。大部分空指针异常的出现是因为使用不完整的信息创建对象或者未提供所有的依赖项。如果你不允许创建不完整的对象并优雅地拒绝这些请求,你可以在接下来的工作者预防大量的空指针异常。类似的,如果对象允许创建,你需要给他们定义一个合理的默认值。例如一个Employee对象不能在创建的时候没有id和name,但是是否有电话号码是可选的。现在如果Employee没有电话号码,你可以返回一个默认值(例如0)来代替返回null。但是必须谨慎选择,哟有时候检查空指针比调用无效号码要方便。同样的,通过定义什么可以是null,什么不能为null,调用者可以作出明智的决定。failing fast或接受null同样是一个你需要进行选择并贯彻的,重要的设计决策

8)定义数据库中的字段是否可为空。

如果你在使用数据库来保存你的域名对象,如Customers,Orders 等,你需要在数据库本身定义是否为空的约束。因为数据库会从很多代码中获取数据,数据库中有是否为空的检查可以确保你的数据健全。在数据空中维护null约束同样可以帮助你减少Java代码中的空指针检查。当从数据库中加载一个对象是你会明确,哪些字段是可以为null的,而哪些不能,这可以使你代码中不必要的!= null检查最少化。

9) 使用空对象模式(Null Object Pattern)

还有一种方法来避免Java中的空指针异常。如果一个方法返回对象,在调用者中执行一些操作,例如Collection.iterator()方法返回迭代器,其调用者执行遍历。假设如果一个调用者并没有任何迭代器,其可以返回空对象(Null object)而非null。空对象是一个特殊的对象,其在不同的上下文中有不同的意义。例如一个空的迭代器调用hasNext()返回false时,可以是一个空对象。同样的在返回Container和Collection类型方法的例子中,空对象可以被用来代替null作为返回值。我打算另写一篇文章来讲空对象模式,分享几个Java空对象的例子。

这就是全部了,这是几个易于遵从的避免空指针异常的Java技巧和最佳实践。你可以欣赏到这些技巧将非常有用,且不太难实现。如果你有其他比秒这个异常的技巧,而又没包含在这里,请通过评论来和我们分享,我将收录在这里。

以上是Java如何避免出現NullPointerException的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板