摘要:避免不必要的自動(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代替toStringjavaBigDecimal 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使用@NotNull @Nullable的注解f() { try { // ... return result; } catch (SomeException e) { e.printStackTrace(); return Collections.EMPTY_LIST; } }
加上了注解,部分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避免不必要的自動(dòng)裝箱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。當(dāng)它是null的時(shí)候,賦值給int類型的變量就會(huì)拋出NullPointerException。
定義合理的缺省值,以及利用數(shù)據(jù)庫(kù)中的not null限制javapublic class A { private ListintList = 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
摘要:我們應(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...
摘要:在中避免檢查原文譯者來(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ù)...
摘要:近日,在上列舉了開(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ò)誤,與君共「免」。 原文...
摘要:是第一批在堆上分配記錄的類型語(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ù)舉手。非??上?,...
摘要:關(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異常處理的最...
閱讀 3344·2021-11-24 09:38
閱讀 2219·2021-11-23 09:51
閱讀 1799·2021-10-13 09:39
閱讀 2684·2021-09-23 11:53
閱讀 1467·2021-09-02 15:40
閱讀 3703·2019-08-30 15:54
閱讀 1185·2019-08-30 13:04
閱讀 2627·2019-08-30 11:01