摘要:避免不必要的自動裝箱注意返回的是而不是,因此有可能是。定義合理的缺省值,以及利用數(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代替toStringjavaBigDecimal 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使用@NotNull @Nullable的注解f() { try { // ... return result; } catch (SomeException e) { e.printStackTrace(); return Collections.EMPTY_LIST; } }
加上了注解,部分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 ListintList = 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
摘要:我們應(yīng)該考慮使用字符串常量調(diào)用方法來代替使用對象調(diào)用該方法。然而如果我們通過字符串常量來調(diào)用方法,執(zhí)行流程會正常進行檢查方法的參數(shù)在執(zhí)行方法的方法體之前,務(wù)必對方法的參數(shù)進行值檢查。 原文地址作者 Sotirios-Efstathios (Stathis) Maneas譯者 smallcloverThanks for your watching! java.lang.NullPoine...
摘要:在中避免檢查原文譯者來源在中避免檢查如何預(yù)防中著名的異常這是每個初學(xué)者遲早會問到的關(guān)鍵問題之一。引用的發(fā)明者在年道歉,并稱這種錯誤為他的十億美元錯誤。但幸運的是這在中得到了改善。檢查是在底層自動處理的。 在 Java 8 中避免 Null 檢查 原文:Avoid Null Checks in Java 8 譯者:ostatsu 來源:在 Java 8 中避免 Null 檢查 如何預(yù)...
摘要:近日,在上列舉了開發(fā)中常見的個錯誤,與君共免。在多線程中并發(fā)修改集合內(nèi)容是非常常見的,因此需要使用并發(fā)編程中常用的方法進行處理,例如同步鎖對于并發(fā)修改采用特殊的集合等等。在單線程和多線程情況下解決這個問題有微小的差別。 在編程時,開發(fā)者經(jīng)常會遭遇各式各樣莫名錯誤。近日,Sushil Das 在 Geek On Java上列舉了 Java 開發(fā)中常見的 5 個錯誤,與君共「免」。 原文...
摘要:是第一批在堆上分配記錄的類型語言之一。實際上,的這段話低估了過去五十年來數(shù)百萬程序員為修復(fù)空引用所耗費的代價。很明顯,這種方式不具備擴展性,同時還犧牲了代碼的可讀性。是目前程序開發(fā)中最典型的異常。完成這一任務(wù)有多種方法。 用Optional取代null 如果你作為Java程序員曾經(jīng)遭遇過NullPointerException,請舉起手。如果這是你最常遭遇的異常,請繼續(xù)舉手。非常可惜,...
摘要:關(guān)于異常處理的文章已有相當?shù)钠?,本文簡單總結(jié)了的異常處理機制,并結(jié)合代碼分析了一些異常處理的最佳實踐,對異常的性能開銷進行了簡單分析。是程序正常運行中,可以預(yù)料的意外情況,應(yīng)該被捕獲并進行相應(yīng)處理。 關(guān)于異常處理的文章已有相當?shù)钠?,本文簡單總結(jié)了Java的異常處理機制,并結(jié)合代碼分析了一些異常處理的最佳實踐,對異常的性能開銷進行了簡單分析。博客另一篇文章《[譯]Java異常處理的最...
閱讀 3286·2021-11-24 09:38
閱讀 2158·2021-11-23 09:51
閱讀 1750·2021-10-13 09:39
閱讀 2624·2021-09-23 11:53
閱讀 1408·2021-09-02 15:40
閱讀 3660·2019-08-30 15:54
閱讀 1135·2019-08-30 13:04
閱讀 2566·2019-08-30 11:01