成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java中避免NullPointerException的一些方法

?xiaoxiao, / 3366人閱讀

摘要:避免不必要的自動裝箱注意返回的是而不是,因此有可能是。定義合理的缺省值,以及利用數(shù)據(jù)庫中的限制比如類中的成員都給初始化一個空的對象。實現(xiàn)一個表示的類這并不是通用的做法,對特定的業(yè)務(wù)邏輯比較有用。

在字符串常量上調(diào)用equals
java// good
"string literal".equals(strObject)
// not good
strObject.equals("string literal")

如果strOject == null,那下面一種方法就會拋出NullPointerException

用valueOf代替toString
javaBigDecimal bd = getPrice();
// good
String.valueOf(bd);
// not good
bd.toString();

原因類似

使用null-safe的庫

如Apache commons中的StringUtils,下面這些方法都不會拋出NullPointerException

javaStringUtils.isEmpty(null); // returns true
StringUtils.isBlank(null); // returns true
StringUtils.isNumeric(null); // returns false
StringUtils.isAllUpperCase(null); // returns false
函數(shù)盡量不要返回null,而是返回一個空的對象

Collections輔助類中有靜態(tài)的EMPTY_LIST EMPTY_SET EMPTY_MAP,可以方便的使用它們

javapublic List f() {
    try {
        // ...
        return result;
    } catch (SomeException e) {
        e.printStackTrace();
        return Collections.EMPTY_LIST;
    }
}
使用@NotNull @Nullable的注解

加上了注解,部分IDE會幫你檢查你是否沒有檢查可能為null的對象,或者你是否做了多余的檢查。這個注解是JSR 305的一部分。但即使IDE不支持,這也會使代碼的可讀性變好。

注意加上的注解最好不要產(chǎn)生額外的依賴。java6中有@NotNull但它所在的包似乎并不默認就在JRE中,java8中有@NonNull,如果確定代碼不用向下兼容,可以使用java8的@NonNull。

java@NonNull List strList; // A non-null list of Strings.
List<@NonNull String> strList; // A list of non-null Strings. 
避免不必要的自動裝箱
java// Integer getPrice();
int price = obj.getPrice();

注意getPrice返回的是Integer而不是int,因此有可能是null。當它是null的時候,賦值給int類型的變量就會拋出NullPointerException。

定義合理的缺省值,以及利用數(shù)據(jù)庫中的not null限制
javapublic class A {
    private List intList = new ArrayList();
    private String str = "";
}

比如類中的成員都給初始化一個空的對象。以及數(shù)據(jù)庫中not null的字段在java里我們就可以放心大膽的使用基本類型如int而不是Integer了。

實現(xiàn)一個表示null的類

這并不是通用的做法,對特定的業(yè)務(wù)邏輯比較有用。

有一個很好的例子就是著名JSON解析框架Jackson。以下代碼是Jackson從一段JSON中獲取其一級子節(jié)點lv1下的二級子節(jié)點lv2的內(nèi)容:

javaJsonNode root = ...;
JsonNode child = root.get("lv1").get("lv2");

以上代碼很可能遇到lv1不存在的情況,因此第一個get()就會返回null,那么第二個get()執(zhí)行時自然就拋出NullPointerException了。為了解決這個問題,作者提供了path方法來替代get方法:

javaJsonNode root = ...;
JsonNode child = root.path("lv1").path("lv2");

當lv1不存在時,path()返回一個JsonNode的子類叫做MissingNode(但客戶端暫時無需知道),MissingNode的path方法則繼續(xù)返回MissingNode,這樣無論這個鏈式調(diào)用寫多長都不會拋出任何異常。

直到最后客戶端調(diào)用完成后檢查返回結(jié)果是否為MissingNode:

javaif (child.isMissingNode()) { ... }
本文參考

http://javarevisited.blogspot.sg/2013/05/ava-tips-and-best-practices-to-avoid-nullpointerexception-program-application.html
http://segmentfault.com/q/1010000000114775

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64219.html

相關(guān)文章

  • How to handle Null Pointer Exception(譯)

    摘要:我們應(yīng)該考慮使用字符串常量調(diào)用方法來代替使用對象調(diào)用該方法。然而如果我們通過字符串常量來調(diào)用方法,執(zhí)行流程會正常進行檢查方法的參數(shù)在執(zhí)行方法的方法體之前,務(wù)必對方法的參數(shù)進行值檢查。 原文地址作者 Sotirios-Efstathios (Stathis) Maneas譯者 smallcloverThanks for your watching! java.lang.NullPoine...

    MRZYD 評論0 收藏0
  • Java 8 避免 Null 檢查

    摘要:在中避免檢查原文譯者來源在中避免檢查如何預(yù)防中著名的異常這是每個初學(xué)者遲早會問到的關(guān)鍵問題之一。引用的發(fā)明者在年道歉,并稱這種錯誤為他的十億美元錯誤。但幸運的是這在中得到了改善。檢查是在底層自動處理的。 在 Java 8 中避免 Null 檢查 原文:Avoid Null Checks in Java 8 譯者:ostatsu 來源:在 Java 8 中避免 Null 檢查 如何預(yù)...

    ethernet 評論0 收藏0
  • [譯] Java 最常見 5 個錯誤

    摘要:近日,在上列舉了開發(fā)中常見的個錯誤,與君共免。在多線程中并發(fā)修改集合內(nèi)容是非常常見的,因此需要使用并發(fā)編程中常用的方法進行處理,例如同步鎖對于并發(fā)修改采用特殊的集合等等。在單線程和多線程情況下解決這個問題有微小的差別。 在編程時,開發(fā)者經(jīng)常會遭遇各式各樣莫名錯誤。近日,Sushil Das 在 Geek On Java上列舉了 Java 開發(fā)中常見的 5 個錯誤,與君共「免」。 原文...

    chemzqm 評論0 收藏0
  • Java8實戰(zhàn)》-第十章筆記(用Optional取代null)

    摘要:是第一批在堆上分配記錄的類型語言之一。實際上,的這段話低估了過去五十年來數(shù)百萬程序員為修復(fù)空引用所耗費的代價。很明顯,這種方式不具備擴展性,同時還犧牲了代碼的可讀性。是目前程序開發(fā)中最典型的異常。完成這一任務(wù)有多種方法。 用Optional取代null 如果你作為Java程序員曾經(jīng)遭遇過NullPointerException,請舉起手。如果這是你最常遭遇的異常,請繼續(xù)舉手。非常可惜,...

    flybywind 評論0 收藏0
  • 淺析Java異常處理機制

    摘要:關(guān)于異常處理的文章已有相當?shù)钠?,本文簡單總結(jié)了的異常處理機制,并結(jié)合代碼分析了一些異常處理的最佳實踐,對異常的性能開銷進行了簡單分析。是程序正常運行中,可以預(yù)料的意外情況,應(yīng)該被捕獲并進行相應(yīng)處理。 關(guān)于異常處理的文章已有相當?shù)钠?,本文簡單總結(jié)了Java的異常處理機制,并結(jié)合代碼分析了一些異常處理的最佳實踐,對異常的性能開銷進行了簡單分析。博客另一篇文章《[譯]Java異常處理的最...

    NSFish 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<