摘要:避免不必要的自動裝箱注意返回的是而不是,因此有可能是。定義合理的缺省值,以及利用數據庫中的限制比如類中的成員都給初始化一個空的對象。實現一個表示的類這并不是通用的做法,對特定的業務邏輯比較有用。
在字符串常量上調用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函數盡量不要返回null,而是返回一個空的對象
Collections輔助類中有靜態的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不支持,這也會使代碼的可讀性變好。
注意加上的注解最好不要產生額外的依賴。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。
定義合理的缺省值,以及利用數據庫中的not null限制javapublic class A { private ListintList = new ArrayList (); private String str = ""; }
比如類中的成員都給初始化一個空的對象。以及數據庫中not null的字段在java里我們就可以放心大膽的使用基本類型如int而不是Integer了。
實現一個表示null的類這并不是通用的做法,對特定的業務邏輯比較有用。
有一個很好的例子就是著名JSON解析框架Jackson。以下代碼是Jackson從一段JSON中獲取其一級子節點lv1下的二級子節點lv2的內容:
javaJsonNode root = ...; JsonNode child = root.get("lv1").get("lv2");
以上代碼很可能遇到lv1不存在的情況,因此第一個get()就會返回null,那么第二個get()執行時自然就拋出NullPointerException了。為了解決這個問題,作者提供了path方法來替代get方法:
javaJsonNode root = ...; JsonNode child = root.path("lv1").path("lv2");
當lv1不存在時,path()返回一個JsonNode的子類叫做MissingNode(但客戶端暫時無需知道),MissingNode的path方法則繼續返回MissingNode,這樣無論這個鏈式調用寫多長都不會拋出任何異常。
直到最后客戶端調用完成后檢查返回結果是否為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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64219.html
摘要:我們應該考慮使用字符串常量調用方法來代替使用對象調用該方法。然而如果我們通過字符串常量來調用方法,執行流程會正常進行檢查方法的參數在執行方法的方法體之前,務必對方法的參數進行值檢查。 原文地址作者 Sotirios-Efstathios (Stathis) Maneas譯者 smallcloverThanks for your watching! java.lang.NullPoine...
摘要:在中避免檢查原文譯者來源在中避免檢查如何預防中著名的異常這是每個初學者遲早會問到的關鍵問題之一。引用的發明者在年道歉,并稱這種錯誤為他的十億美元錯誤。但幸運的是這在中得到了改善。檢查是在底層自動處理的。 在 Java 8 中避免 Null 檢查 原文:Avoid Null Checks in Java 8 譯者:ostatsu 來源:在 Java 8 中避免 Null 檢查 如何預...
摘要:近日,在上列舉了開發中常見的個錯誤,與君共免。在多線程中并發修改集合內容是非常常見的,因此需要使用并發編程中常用的方法進行處理,例如同步鎖對于并發修改采用特殊的集合等等。在單線程和多線程情況下解決這個問題有微小的差別。 在編程時,開發者經常會遭遇各式各樣莫名錯誤。近日,Sushil Das 在 Geek On Java上列舉了 Java 開發中常見的 5 個錯誤,與君共「免」。 原文...
摘要:是第一批在堆上分配記錄的類型語言之一。實際上,的這段話低估了過去五十年來數百萬程序員為修復空引用所耗費的代價。很明顯,這種方式不具備擴展性,同時還犧牲了代碼的可讀性。是目前程序開發中最典型的異常。完成這一任務有多種方法。 用Optional取代null 如果你作為Java程序員曾經遭遇過NullPointerException,請舉起手。如果這是你最常遭遇的異常,請繼續舉手。非常可惜,...
摘要:關于異常處理的文章已有相當的篇幅,本文簡單總結了的異常處理機制,并結合代碼分析了一些異常處理的最佳實踐,對異常的性能開銷進行了簡單分析。是程序正常運行中,可以預料的意外情況,應該被捕獲并進行相應處理。 關于異常處理的文章已有相當的篇幅,本文簡單總結了Java的異常處理機制,并結合代碼分析了一些異常處理的最佳實踐,對異常的性能開銷進行了簡單分析。博客另一篇文章《[譯]Java異常處理的最...
閱讀 3267·2021-11-24 09:38
閱讀 2148·2021-11-23 09:51
閱讀 1738·2021-10-13 09:39
閱讀 2610·2021-09-23 11:53
閱讀 1394·2021-09-02 15:40
閱讀 3648·2019-08-30 15:54
閱讀 1121·2019-08-30 13:04
閱讀 2552·2019-08-30 11:01