# Java空指標預防
阿新 • • 發佈:2018-12-11
-
equals
方法把確定不是null
的作為物件呼叫,儘量當引數而不是物件使用String s = null; String m = "s"; //true m.equals(s); //false s.equals(m);
-
在兩者返回相同結果的時候偏向使用
valueOf()
而非``toString()`double price = getPrice(); System.out.println(Double.valueOf(price)); //doesn’t throw NPE System.out.println(price.toString()); //throws “Exception in thread “main” java.lang.NullPointerException
-
使用空安全方法(null safe method)或者類庫(空引數不報異常)
System.out.println(StringUtils.isEmpty(null)); System.out.println(StringUtils.isBlank(null)); System.out.println(StringUtils.isNumeric(null)); System.out.println(StringUtils.isAllUpperCase(null)); Output: true true false false
-
避免用返回空的
collection
或者空的array
通過返回一個空的collection或者一個空的array可以確定像size(),length() 這種基礎的呼叫不會丟擲NullPointException。 Collection類能夠提供方便的空的List,Set和Map,(這些)有Collections.EMPTY_LIST, Collections.EMPTY_SET和 Collections.EMPTY_MAP這些能夠被使 原本空的集合用這些靜態變數的方式預防空指標
public List getOrders(Customer customer){ List result = Collections.EMPTY_LIST;
注意:使用Collections.emptyList()生成的List不支援add方法
-
使用@NotNull和@Nullable註釋
當寫你可以定義關於約定可空性(Nullability),要通過使用像@NotNull和@Nullable類似的註釋 提示這個方法 是否為空安全(null safe)。 現代的編譯器,IDE和其他工具可以讀出這個註釋來幫你做一個空檢查或者告訴你是否需要空檢查。 IntelliJ IDE和findbugs 已經支援這種註釋。 這些註釋也是JSR 305(譯者注:可以理解為java的標準)的一部分。 通過看到@NotNull和@Nullable,程式猿可以自己決定是否去進行空檢查。 順便說下,對於JAVA程式猿來說,這是新的實踐,儘管需要一點時間去適應。
-
遵循約定和定義合理的預設值
在java領域,一個最佳的避免空指標的方法之一就是和定下約定和遵守約定。 大部分的NullPointException發生原因就是使用了一個不完整的資訊或 者並沒有被提供所有的依賴資訊來建立象。 如果你不允許建立不完整的物件和否定任何這種要求, 你可以預防很多一段時間之後發生的NullPointException。如果物件被允許建立,那麼你應該設定合理的預設值。 例如,一個Employee(僱員)物件不可以在沒有Id和Name屬性的情況下被建立, 但可以有一個可供選擇的pghone number(電話號碼)。如果Employee沒有phone number, 那麼就用返回一個0來代替返回一個空值。 但是這種處理必須非常小心地處理對空值的檢查而不是檢查非法輸入。 同樣要注意,定義可以使空值的或者不可以空值的時候,提醒呼叫者作出被告知的決定。 失敗之後的選擇或者接受空值也是一個你需要重視的重要設計。
-
資料庫對空值的約束
如果你使用資料庫去儲存你的域物件(demain object),例如:Customer、Orders等等, 那麼你應該定義一些在資料庫對空值的約束。因為資料庫可以要求獲得從多個來源來的資料, 在資料庫中擁有對空值的檢查將會確保資料的完整性。 在資料庫中保留對空值約束的約束也是會讓你減少在JAVA中減少空檢查的程式碼。 當從資料庫中取出一個物件是,你可以確保那些屬性可以是空而那些屬性不可以使空, 這將會讓那些空檢查的程式碼最小化。
-
使用空物件模式(new Obj())
這是另外一個在JAVA裡面避免NullPointException的方法。如果一個方法返回一個物件,呼叫者要遍歷這個物件, 就要使用一些類似Collection.iterator()的方法去返回iterator。 如果呼叫者沒有任何的上述的這些方法,那他需要返回的是空物件而不是空(null)。 空物件是一個特別的物件,它在不同的上下文中有不同的含義。 像這些返回Contrainter或者Conllection型別的方法的情況中, 裡面為空的物件(Empty object)應該被使用而不是返回空。