成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Java中避免NullPointerException的一些方法

?xiaoxiao, / 3430人閱讀

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

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

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

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

原因類似

使用null-safe的庫(kù)

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

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

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會(huì)幫你檢查你是否沒(méi)有檢查可能為null的對(duì)象,或者你是否做了多余的檢查。這個(gè)注解是JSR 305的一部分。但即使IDE不支持,這也會(huì)使代碼的可讀性變好。

注意加上的注解最好不要產(chǎn)生額外的依賴。java6中有@NotNull但它所在的包似乎并不默認(rèn)就在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. 
避免不必要的自動(dòng)裝箱
java// Integer getPrice();
int price = obj.getPrice();

注意getPrice返回的是Integer而不是int,因此有可能是null。當(dāng)它是null的時(shí)候,賦值給int類型的變量就會(huì)拋出NullPointerException。

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

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

實(shí)現(xiàn)一個(gè)表示null的類

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

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

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

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

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

當(dāng)lv1不存在時(shí),path()返回一個(gè)JsonNode的子類叫做MissingNode(但客戶端暫時(shí)無(wú)需知道),MissingNode的path方法則繼續(xù)返回MissingNode,這樣無(wú)論這個(gè)鏈?zhǔn)秸{(diào)用寫(xiě)多長(zhǎng)都不會(huì)拋出任何異常。

直到最后客戶端調(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/64219.html

相關(guān)文章

  • How to handle Null Pointer Exception(譯)

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

    MRZYD 評(píng)論0 收藏0
  • Java 8 避免 Null 檢查

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

    ethernet 評(píng)論0 收藏0
  • [譯] Java 最常見(jiàn) 5 個(gè)錯(cuò)誤

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

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

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

    flybywind 評(píng)論0 收藏0
  • 淺析Java異常處理機(jī)制

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

    NSFish 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<