最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

由@NotNull注解引出的關于Java空指針的控制

 更新時間:2016年09月30日 23:12:05   投稿:mdxy-dxy  
這是一些很容易學會的簡單技術,但是對于代碼質(zhì)量和健壯性來說確實很重要。以我的經(jīng)驗,僅是第一個小技巧就已經(jīng)對改進代碼質(zhì)量具有很大的作用了

Java 小技巧和在java應用避免NullPonintException的最佳方法

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

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

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

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

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技巧,但是結果會是極大的改進,因為equal()是一個很普遍的方法。

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

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

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"

如果你不確定你所使用的對象是否是空的時候,請使用這個JAVA技巧

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

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

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

但在作出任何結論之前,不要忘記閱讀關于Null安全方法和類的文檔。這是另一個java最佳操練,這不會要求你付出非常多的努力,但會讓你獲得很大的進步。

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

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

代碼如下;

 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注釋

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

6)遵循約定和定義合理的默認值

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

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

8)使用空對象模式

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

相關文章

  • MyBatis+Calcite實現(xiàn)多數(shù)據(jù)庫SQL自動適配的詳細指南

    MyBatis+Calcite實現(xiàn)多數(shù)據(jù)庫SQL自動適配的詳細指南

    在當今企業(yè)IT環(huán)境中,數(shù)據(jù)庫異構性已成為常態(tài),根據(jù)DB-Engines最新調(diào)研,超過78%的企業(yè)同時使用兩種以上數(shù)據(jù)庫系統(tǒng),所以本文就來為大家介紹一下如何基于MyBatis+Calcite實現(xiàn)多數(shù)據(jù)庫SQL自動適配吧
    2025-04-04
  • Java8中方法引用的使用詳解

    Java8中方法引用的使用詳解

    這篇文章主要介紹了Java 8 中的方法引用使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • java 一個類實現(xiàn)兩個接口的案例

    java 一個類實現(xiàn)兩個接口的案例

    這篇文章主要介紹了java 一個類實現(xiàn)兩個接口的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java線程等待喚醒幾種方法小結

    Java線程等待喚醒幾種方法小結

    線程等待和喚醒有三種實現(xiàn)方法,分別是Object類中的wait、notify,Condition類中的await、signal,LockSupport類中的park、unpark方法,感興趣的可以了解一下
    2023-10-10
  • RSA加密的方式和解密方式實現(xiàn)方法(推薦)

    RSA加密的方式和解密方式實現(xiàn)方法(推薦)

    下面小編就為大家?guī)硪黄猂SA加密的方式和解密方式實現(xiàn)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 如何使用會話Cookie和Java實現(xiàn)JWT身份驗證

    如何使用會話Cookie和Java實現(xiàn)JWT身份驗證

    這篇文章主要介紹了如何使用會話Cookie和Java實現(xiàn)JWT身份驗證,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Spring Boot Admin微服務應用監(jiān)控的實現(xiàn)

    Spring Boot Admin微服務應用監(jiān)控的實現(xiàn)

    這篇文章主要介紹了Spring Boot Admin微服務應用監(jiān)控,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Java使用線程池的優(yōu)勢有哪些

    Java使用線程池的優(yōu)勢有哪些

    這篇文章主要介紹了Java使用線程池的優(yōu)勢有哪些,幫助大家更好的理解和掌握java池化技術,感興趣的朋友可以了解下
    2020-09-09
  • 修改idea運行內(nèi)存大小的方法總結

    修改idea運行內(nèi)存大小的方法總結

    在開發(fā)過程中,總會遇到idea運行內(nèi)存不足,所以本文小編給大家介紹了修改idea運行內(nèi)存大小的兩種方法,文中通過圖文給大家講解的非常詳細,需要的朋友可以參考下
    2023-12-12
  • MyBatis如何使用(一)

    MyBatis如何使用(一)

    這篇文章主要介紹了MyBatis如何使用(一)的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07

最新評論

东丽区| 婺源县| 门源| 邵阳县| 皮山县| 陆良县| 清苑县| 黑龙江省| 达州市| 新晃| 阿合奇县| 慈溪市| 阜南县| 河曲县| 琼结县| 万州区| 锡林浩特市| 枞阳县| 枞阳县| 阳西县| 九江市| 怀仁县| 吉首市| 惠来县| 呼图壁县| 商南县| 樟树市| 梓潼县| 扎鲁特旗| 全椒县| 馆陶县| 瑞昌市| 大姚县| 广东省| 双峰县| 灵璧县| 石首市| 安义县| 义乌市| 榆社县| 名山县|