一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - java 避免出現(xiàn)NullPointerException(空指針)的方法總結(jié)

java 避免出現(xiàn)NullPointerException(空指針)的方法總結(jié)

2020-12-29 14:55心中要有一片海 Java教程

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

java 避免出現(xiàn)NullPointerException空指針)的方法總結(jié)

Java應(yīng)用中拋出的空指針異常是解決空指針的最好方式,也是寫(xiě)出能順利工作的健壯程序的關(guān)鍵。俗話說(shuō)“預(yù)防勝于治療”,對(duì)于這么令人討厭的空指針異常,這句話也是成立的。值得慶幸的是運(yùn)用一些防御性的編碼技巧,跟蹤應(yīng)用中多個(gè)部分之間的聯(lián)系,你可以將Java中的空指針異常控制在一個(gè)很好的水平上。順便說(shuō)一句,這是Javarevisited上的第二個(gè)空指針異常的帖子。在上個(gè)帖子中我們討論了Java中導(dǎo)致空指針異常的常見(jiàn)原因,而在本教程中我們將會(huì)學(xué)習(xí)一些Java的編程技巧和最佳實(shí)踐。這些技巧可以幫助你避免Java中的空指針異常。遵從這些技巧同樣可以減少Java代碼中到處都有的非空檢查的數(shù)量。作為一個(gè)有經(jīng)驗(yàn)的Java程序員,你可能已經(jīng)知道其中的一部分技巧并且應(yīng)用在你的項(xiàng)目中。但對(duì)于新手和中級(jí)開(kāi)發(fā)人員來(lái)說(shuō),這將是很值得學(xué)習(xí)的。順便說(shuō)一句,如果你知道其它的避免空指針異常和減少空指針檢查的Java技巧,請(qǐng)和我們分享。

這些都是簡(jiǎn)單的技巧,很容易應(yīng)用,但是對(duì)代碼質(zhì)量和健壯性有顯著影響。根據(jù)我的經(jīng)驗(yàn),只有第一個(gè)技巧可以顯著改善代碼質(zhì)量。如我之前所講,如果你知道任何避免空指針異常和減少空指針檢查的Java技巧,你可以通過(guò)評(píng)論本文來(lái)和分享。

1) 從已知的String對(duì)象中調(diào)用equals()和equalsIgnoreCase()方法,而非未知對(duì)象。

總是從已知的非空String對(duì)象中調(diào)用equals()方法。因?yàn)閑quals()方法是對(duì)稱的,調(diào)用a.equals(b)和調(diào)用b.equals(a)是完全相同的,這也是為什么程序員對(duì)于對(duì)象a和b這么不上心。如果調(diào)用者是空指針,這種調(diào)用可能導(dǎo)致一個(gè)空指針異常

?
1
2
3
4
5
6
7
8
9
10
11
Object unknownObject = null;
 
//錯(cuò)誤方式 – 可能導(dǎo)致 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");
}

這是避免空指針異常最簡(jiǎn)單的Java技巧,但能夠?qū)е戮薮蟮母倪M(jìn),因?yàn)閑quals()是一個(gè)常見(jiàn)方法。

2) 當(dāng)valueOf()和toString()返回相同的結(jié)果時(shí),寧愿使用前者。

因?yàn)檎{(diào)用null對(duì)象的toString()會(huì)拋出空指針異常,如果我們能夠使用valueOf()獲得相同的值,那寧愿使用valueOf(),傳遞一個(gè)null給valueOf()將會(huì)返回“null”,尤其是在那些包裝類,像Integer、Float、Double和BigDecimal。

?
1
2
3
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //不會(huì)拋出空指針異常
System.out.println(bd.toString()); //拋出 "Exception in thread "main" java.lang.NullPointerException"

3) 使用null安全的方法和庫(kù) 有很多開(kāi)源庫(kù)已經(jīng)為您做了繁重的空指針檢查工作。其中最常用的一個(gè)的是Apache commons 中的StringUtils。你可以使用StringUtils.isBlank(),isNumeric(),isWhiteSpace()以及其他的工具方法而不用擔(dān)心空指針異常。

?
1
2
3
4
5
6
7
8
9
10
11
//StringUtils方法是空指針安全的,他們不會(huì)拋出空指針異常
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

但是在做出結(jié)論之前,不要忘記閱讀空指針?lè)椒ǖ念惖奈臋n。這是另一個(gè)不需要下大功夫就能得到很大改進(jìn)的Java最佳實(shí)踐。

4) 避免從方法中返回空指針,而是返回空collection或者空數(shù)組。

這個(gè)Java最佳實(shí)踐或技巧由Joshua Bloch在他的書(shū)Effective Java中提到。這是另外一個(gè)可以更好的使用Java編程的技巧。通過(guò)返回一個(gè)空collection或者空數(shù)組,你可以確保在調(diào)用如size(),length()的時(shí)候不會(huì)因?yàn)榭罩羔槷惓1罎ⅰollections類提供了方便的空List,Set和Map: Collections.EMPTY_LIST,Collections.EMPTY_SET,Collections.EMPTY_MAP。這里是實(shí)例。

?
1
2
3
4
public List getOrders(Customer customer){
  List result = Collections.EMPTY_LIST;
  return result;
}

你同樣可以使用Collections.EMPTY_SET和Collections.EMPTY_MAP來(lái)代替空指針。

5) 使用annotation@NotNull 和 @Nullable

在寫(xiě)程序的時(shí)候你可以定義是否可為空指針。通過(guò)使用像@NotNull和@Nullable之類的annotation來(lái)聲明一個(gè)方法是否是空指針安全的。現(xiàn)代的編譯器、IDE或者工具可以讀此annotation并幫你添加忘記的空指針檢查,或者向你提示出不必要的亂七八糟的空指針檢查。IntelliJ和findbugs已經(jīng)支持了這些annotation。這些annotation同樣是JSR 305的一部分,但即便IDE或工具中沒(méi)有,這個(gè)annotation本身可以作為文檔。看到@NotNull和@Nullable,程序員自己可以決定是否做空指針檢查。順便說(shuō)一句,這個(gè)技巧對(duì)Java程序員來(lái)說(shuō)相對(duì)比較新,要采用需要一段時(shí)間。

6) 避免你的代碼中不必要的自動(dòng)包裝和自動(dòng)解包。

且不管其他如創(chuàng)建臨時(shí)對(duì)象的缺點(diǎn),如果wrapper類對(duì)象是null,自動(dòng)包裝同樣容易導(dǎo)致空指針異常。例如如果person對(duì)象沒(méi)有電話號(hào)碼的話會(huì)返回null,如下代碼會(huì)因?yàn)榭罩羔槷惓1罎ⅰ?/p>

?
1
2
Person ram = new Person("ram");
int phone = ram.getPhone();

當(dāng)使用自動(dòng)包裝和自動(dòng)解包的時(shí)候,不僅僅是等號(hào),< > 同樣會(huì)拋出空指針異常。你可以通過(guò)這篇文章來(lái)學(xué)習(xí)更多的Java中的自動(dòng)包裝和拆包的陷阱。

7) 遵從Contract并定義合理的默認(rèn)值。

在Java中避免空指針異常的一個(gè)最好的方法是簡(jiǎn)單的定義contract并遵從它們。大部分空指針異常的出現(xiàn)是因?yàn)槭褂貌煌暾男畔?chuàng)建對(duì)象或者未提供所有的依賴項(xiàng)。如果你不允許創(chuàng)建不完整的對(duì)象并優(yōu)雅地拒絕這些請(qǐng)求,你可以在接下來(lái)的工作者預(yù)防大量的空指針異常。類似的,如果對(duì)象允許創(chuàng)建,你需要給他們定義一個(gè)合理的默認(rèn)值。例如一個(gè)Employee對(duì)象不能在創(chuàng)建的時(shí)候沒(méi)有id和name,但是是否有電話號(hào)碼是可選的。現(xiàn)在如果Employee沒(méi)有電話號(hào)碼,你可以返回一個(gè)默認(rèn)值(例如0)來(lái)代替返回null。但是必須謹(jǐn)慎選擇,喲有時(shí)候檢查空指針比調(diào)用無(wú)效號(hào)碼要方便。同樣的,通過(guò)定義什么可以是null,什么不能為null,調(diào)用者可以作出明智的決定。failing fast或接受null同樣是一個(gè)你需要進(jìn)行選擇并貫徹的,重要的設(shè)計(jì)決策

8)定義數(shù)據(jù)庫(kù)中的字段是否可為空。

如果你在使用數(shù)據(jù)庫(kù)來(lái)保存你的域名對(duì)象,如Customers,Orders 等,你需要在數(shù)據(jù)庫(kù)本身定義是否為空的約束。因?yàn)閿?shù)據(jù)庫(kù)會(huì)從很多代碼中獲取數(shù)據(jù),數(shù)據(jù)庫(kù)中有是否為空的檢查可以確保你的數(shù)據(jù)健全。在數(shù)據(jù)空中維護(hù)null約束同樣可以幫助你減少Java代碼中的空指針檢查。當(dāng)從數(shù)據(jù)庫(kù)中加載一個(gè)對(duì)象是你會(huì)明確,哪些字段是可以為null的,而哪些不能,這可以使你代碼中不必要的!= null檢查最少化。

9) 使用空對(duì)象模式(Null Object Pattern)

還有一種方法來(lái)避免Java中的空指針異常。如果一個(gè)方法返回對(duì)象,在調(diào)用者中執(zhí)行一些操作,例如Collection.iterator()方法返回迭代器,其調(diào)用者執(zhí)行遍歷。假設(shè)如果一個(gè)調(diào)用者并沒(méi)有任何迭代器,其可以返回空對(duì)象(Null object)而非null。空對(duì)象是一個(gè)特殊的對(duì)象,其在不同的上下文中有不同的意義。例如一個(gè)空的迭代器調(diào)用hasNext()返回false時(shí),可以是一個(gè)空對(duì)象。同樣的在返回Container和Collection類型方法的例子中,空對(duì)象可以被用來(lái)代替null作為返回值。我打算另寫(xiě)一篇文章來(lái)講空對(duì)象模式,分享幾個(gè)Java空對(duì)象的例子。

這就是全部了,這是幾個(gè)易于遵從的避免空指針異常的Java技巧和最佳實(shí)踐。你可以欣賞到這些技巧將非常有用,且不太難實(shí)現(xiàn)。如果你有其他比秒這個(gè)異常的技巧,而又沒(méi)包含在這里,請(qǐng)通過(guò)評(píng)論來(lái)和我們分享,我將收錄在這里。

如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

原文鏈接:http://blog.csdn.net/lylwo317/article/details/51198339

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 我要看免费毛片 | 97蜜桃网| 国产成人精选免费视频 | 91啪在线观看国产在线 | 久久99精品涩AV毛片观看 | 四虎一影院区永久精品 | 羞羞答答免费人成黄页在线观看国产 | 人人斗地主 | 成人免费视频一区 | 日本高清二三四本2021 | 日韩视频在线免费观看 | 欧美一区二区三区成人看不卡 | 国产一级视频久久 | 日韩视频在线免费 | 日韩欧美不卡视频 | 美女把小内内脱个精光打屁屁 | 免费观看国产大片资源视频 | 千金肉奴隶免费观看 | www.尤物在线| 午夜精品网 | 蜜桃视频一区二区 | 女仆掀起蕾丝裙被打屁股作文 | 男人的天堂在线观看免费 | 2021国产麻豆剧传媒剧情动漫 | 国产精品亚洲精品观看不卡 | 色噜噜狠狠狠综合曰曰曰88av | 2021国产精品视频一区 | 天堂在线看| 91日本| 美女bbxx美女bbb | 久9青青cao精品视频在线 | 国产美女屁股直流白浆视频无遮挡 | www.男人的天堂.com | 久久综合老色鬼网站 | 国产专区亚洲欧美另类在线 | 厨房play黄瓜进去小说h | 美女污视频在线观看 | 国产好痛疼轻点好爽的视频 | 免费高清www动漫视频播放器 | 啪一啪日一日 | 无人区大片免费播放器 |