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

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

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 由@NotNull注解引出的關(guān)于Java空指針的控制

由@NotNull注解引出的關(guān)于Java空指針的控制

2020-06-19 11:44Java技術(shù)網(wǎng) JAVA教程

這是一些很容易學(xué)會(huì)的簡單技術(shù),但是對(duì)于代碼質(zhì)量和健壯性來說確實(shí)很重要。以我的經(jīng)驗(yàn),僅是第一個(gè)小技巧就已經(jīng)對(duì)改進(jìn)代碼質(zhì)量具有很大的作用了

Java 小技巧和在java應(yīng)用避免NullPonintException的最佳方法

在java應(yīng)用程序中,一個(gè)NullPonintException(空指針異常)是最好解決(問題)的方法。同時(shí),空指針也是寫健壯的順暢運(yùn)行的代碼的關(guān)鍵。“預(yù)防好過治療”這句話也同樣適用于令人不爽的NullPonintException。通過應(yīng)用防御性的編碼技術(shù)和在遵守多個(gè)部分之間的約定,你可以再很大程度上避免NullPointException。下面的這些java小技巧可以最小化像!=null這種檢查的代碼。作為經(jīng)驗(yàn)豐富的java程序猿,你可能意識(shí)到這些技術(shù)的某部分項(xiàng)目當(dāng)中使用它。但是對(duì)于大學(xué)一年級(jí)學(xué)生和中級(jí)開發(fā)者,這是一個(gè)很好的學(xué)習(xí)機(jī)會(huì)。

這是一些很容易學(xué)會(huì)的簡單技術(shù),但是對(duì)于代碼質(zhì)量和健壯性來說確實(shí)很重要。以我的經(jīng)驗(yàn),僅是第一個(gè)小技巧就已經(jīng)對(duì)改進(jìn)代碼質(zhì)量具有很大的作用了。

1)在已經(jīng)的String(字符串)調(diào)用 equal()和 equalsingnoreCase()而不是未知的對(duì)象

通常在已經(jīng)的非空字符串在調(diào)用equals()。因?yàn)閑qual()方法是對(duì)稱的,調(diào)用a.equal()是同等于調(diào)用b.equal(),和這就是為什么很多部注意對(duì)象a和b,如果空的一邊被調(diào)用會(huì)到導(dǎo)致空指針。

?
1
2
3
4
5
6
7
8
9
10
Object unknownObject = null;
 
//wrong way - may cause NullPointerException
if(unknownObject.equals("knownObject")){
  System.err.println("This may result in NullPointerException if unknownObject is null");
}
//right way - avoid NullPointerException even if unknownObject is null
if("knownObject".equals(unknownObject)){
  System.err.println("better coding avoided NullPointerException");
}

這是最重要的避免NullPointException的java技巧,但是結(jié)果會(huì)是極大的改進(jìn),因?yàn)閑qual()是一個(gè)很普遍的方法。

2)在兩者返回相同結(jié)果的時(shí)候偏向使用valueOf()而非toString()

因?yàn)榭諏?duì)象調(diào)用toString()時(shí)會(huì)拋出NullPointException。如果我們可以通過調(diào)用value()得到相同的值的話,就應(yīng)該使用valueOf()。這樣會(huì)傳遞會(huì)一個(gè)空值。特別是在像Integer,F(xiàn)loat,Double或者BigDecimla之類的包裝類的情況下。

?
1
2
3
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //doesn't throw NPE
System.out.println(bd.toString()); //throws "Exception in thread "main" java.lang.NullPointerException"

如果你不確定你所使用的對(duì)象是否是空的時(shí)候,請(qǐng)使用這個(gè)JAVA技巧

3)使用空安全方法(null safe method)或者類庫

現(xiàn)在有很多已經(jīng)為你做了null檢查的開源組件出現(xiàn)。其中一個(gè)最為普遍的就是Apache的StringUtils。你可以使用StringUtils.isBlank(),isNumberic(),isWhiteSpace()和其他工具一些不用擔(dān)心NullPointException方法。

?
1
2
3
4
5
6
7
8
9
10
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é)論之前,不要忘記閱讀關(guān)于Null安全方法和類的文檔。這是另一個(gè)java最佳操練,這不會(huì)要求你付出非常多的努力,但會(huì)讓你獲得很大的進(jìn)步。

4)避免用返回空的collection或者空的array來代替從方法中返回Null

這個(gè)java技巧也是在Joshua Bloch的《Effective Java》所提及的。這本書也是一個(gè)提高JAVA編碼能力的一個(gè)來源。通過返回一個(gè)空的collection或者一個(gè)空的array可以確定像size(),length()這種基礎(chǔ)的調(diào)用不會(huì)拋出NullPointException。Collection類能夠提供方便的空的List,Set和Map,(這些)有Collections.EMPTY_LIST, Collections.EMPTY_SET和 Collections.EMPTY_MAP這些能夠被使用的(靜態(tài)變量)。

代碼如下;

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

類似地你可以使用Collections.EMPTY_LIST, Collections.EMPTY_SET和 Collections.EMPTY_MAP來代替返回Null。

5)使用@NotNull和@Nullable注釋

當(dāng)寫你可以定義關(guān)于約定可空性(Nullability),要通過使用像@NotNull和@Nullable類似的注釋提示這個(gè)方法是否為空安全(null safe)。現(xiàn)代的編譯器,IDE和其他工具可以讀出這個(gè)注釋來幫你做一個(gè)空檢查或者告訴你是否需要空檢查。IntelliJIDE和findbugs 已經(jīng)支持這種注釋。這些注釋也是JSR 305(譯者注:可以理解為java的標(biāo)準(zhǔn))的一部分。通過看到@NotNull和@Nullable,程序猿可以自己決定是否去進(jìn)行空檢查。順便說下,對(duì)于JAVA程序猿來說,這是新的最好的實(shí)踐,盡管需要一點(diǎn)時(shí)間去適應(yīng)。

6)遵循約定和定義合理的默認(rèn)值

在java領(lǐng)域,一個(gè)最佳的避免空指針的方法之一就是和定下約定和遵守約定。大部分的NullPointException發(fā)生原因就是使用了一個(gè)不完整的信息或者并沒有被提供所有的依賴信息來創(chuàng)建對(duì)象。如果你不允許創(chuàng)建不完整的對(duì)象和否定任何這種要求,你可以預(yù)防很多一段時(shí)間之后發(fā)生的NullPointException。如果對(duì)象被允許創(chuàng)建,那么你應(yīng)該設(shè)定合理的默認(rèn)值。例如,一個(gè)Employee(雇員)對(duì)象不可以在沒有Id和Name屬性的情況下被創(chuàng)建,但可以有一個(gè)可供選擇的pghone number(電話號(hào)碼)。如果Employee沒有phone number,那么就用返回一個(gè)0來代替返回一個(gè)空值。但是這種處理必須非常小心地處理對(duì)空值的檢查而不是檢查非法輸入。同樣要注意,定義可以使空值的或者不可以空值的時(shí)候,提醒調(diào)用者作出被告知的決定。失敗之后的選擇或者接受空值也是一個(gè)你需要重視的重要設(shè)計(jì)。

7)如果你使用數(shù)據(jù)庫去存儲(chǔ)你的域?qū)ο螅╠emain object)
例如:Customer、Orders等等,那么你應(yīng)該定義一些在數(shù)據(jù)庫對(duì)空值的約束。因?yàn)閿?shù)據(jù)庫可以要求獲得從多個(gè)來源來的數(shù)據(jù),在數(shù)據(jù)庫中擁有對(duì)空值的檢查將會(huì)確保數(shù)據(jù)的完整性。在數(shù)據(jù)庫中保留對(duì)空值約束的約束也是會(huì)讓你減少在JAVA中減少空檢查的代碼。當(dāng)從數(shù)據(jù)庫中取出一個(gè)對(duì)象是,你可以確保那些屬性可以是空而那些屬性不可以使空,這將會(huì)讓那些空檢查的代碼最小化。

8)使用空對(duì)象模式

這是另外一個(gè)在JAVA里面避免NullPointException的方法。如果一個(gè)方法返回一個(gè)對(duì)象,哪個(gè)調(diào)用者要遍歷這個(gè)對(duì)象,哪個(gè)調(diào)用者就要使用一些類似Collection.iterator()的方法去返回iterator。如果調(diào)用者沒有任何的上述的這些方法,那么有可能返回的是空對(duì)象而不是空(null)。空對(duì)象是一個(gè)特別的對(duì)象,它在不同的上下文中有不同的含義。像這些返回Contrainter或者Conllection類型的方法的情況中,里面為空的對(duì)象(Empty object)應(yīng)該被使用而不是返回空。

以上所述是小編給大家介紹的由@NotNull注解引出的關(guān)于Java空指針的控制方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男生的j桶女人屁免费视频 男生操男生 | 亚洲无线一二三四区 | 成人国产网站v片免费观看 成人国产精品视频 | 久久精品人人做人人爽97 | 久久久久综合 | 99亚洲自拍| 办公室强行丝袜秘书啪啪 | 2021最新国产成人精品视频 | 深夜在线观看 | 深夜网站在线观看 | 国产福利兔女郎在线观看 | 色悠久久久久综合欧美99 | 日本四虎影院 | 深夜在线观看 | 国产三级自拍视频 | 5g影院天天5g爽天天看 | 精品久久久久久亚洲 | 日韩特级片 | 精品日韩二区三区精品视频 | 亚洲一区二区三区在线播放 | 天堂一区二区在线观看 | 亚洲性色永久网址 | yy111111免费观看 | 韩国甜性涩爱在线播放 | 亚洲午夜精品久久久久久人妖 | 大桥未久midd—962在线 | 国产最强大片免费视频 | 国产日产韩产麻豆1区 | eeuss免费快捷 | 日韩欧美在线视频一区二区 | 日本高清视频在线免费观看 | 强漂亮白丝女教师小说 | 国产成人www | 日本视频在线免费看 | yellow最新视频2019 | 午夜伦午夜伦锂电影 | 青草青草久热精品视频在线网站 | 日本高清免费看 | 人与动人物人a级特片 | 国产盗摄美女嘘嘘视频 | 思敏1一5集国语版免费观看 |