1. 程式人生 > >由@NotNull 註解引出的關於Java空指標的控制

由@NotNull 註解引出的關於Java空指標的控制

Java 小技巧和在java應用避免NullPonintException的最佳方法

在java應用程式中,一個NullPonintException(空指標異常)是最好解決(問題)的方法。同時,空指標也是寫健壯的順暢執行的程式碼的關鍵。“預防好過治療”這句話也同樣適用於令人不爽的NullPonintException。通過應用防禦性的編碼技術和在遵守多個部分之間的約定,你可以再很大程度上避免NullPointException。下面的這些java小技巧可以最小化像!=null這種檢查的程式碼。作為經驗豐富的java程式猿,你可能意識到這些技術的某部分專案當中使用它。但是對於大學一年級學生和中級開發者,這是一個很好的學習機會。

這是一些很容易學會的簡單技術,但是對於程式碼質量和健壯性來說確實很重要。以我的經驗,僅是第一個小技巧就已經對改進程式碼質量具有很大的作用了。

1)在已經的String(字串)呼叫 equal()和 equalsingnoreCase()而不是未知的物件

通常在已經的非空字串在呼叫equals()。因為equal()方法是對稱的,呼叫a.equal()是同等於呼叫b.equal(),和這就是為什麼很多部注意物件a和b,如果空的一邊被呼叫會到導致空指標。

Object unknownObject = null;

//wrong way - may cause NullPointerException
if(unknownObject.equals(“knownObject”)){
System.err.println(“This may result in NullPointerException if unknownObject is null”);
}

//right way - avoid NullPointerException even if unknownObject is null
if(“knownObject”.equals(unknownObject)){
System.err.println(“better coding avoided NullPointerException”);
}

這是最重要的避免NullPointException的java技巧,但是結果會是極大的改進,因為equal()是一個很普遍的方法。

2)在兩者返回相同結果的時候偏向使用valueOf()而非toString()

因為空物件呼叫toString()時會丟擲NullPointException。如果我們可以通過呼叫value()得到相同的值的話,就應該使用valueOf()。這樣會傳遞會一個空值。特別是在像Integer,Float,Double或者BigDecimla之類的包裝類的情況下。

BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //doesn’t throw NPE
System.out.println(bd.toString()); //throws “Exception in thread “main” java.lang.NullPointerException”

如果你不確定你所使用的物件是否是空的時候,請使用這個JAVA技巧

3)使用空安全方法(null safe method)或者類庫

現在有很多已經為你做了null檢查的開源元件出現。其中一個最為普遍的就是Apache的StringUtils。你可以使用StringUtils.isBlank(),isNumberic(),isWhiteSpace()和其他工具一些不用擔心NullPointException方法。

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

但在作出任何結論之前,不要忘記閱讀關於Null安全方法和類的文件。這是另一個java最佳操練,這不會要求你付出非常多的努力,但會讓你獲得很大的進步。

4)避免用返回空的collection或者空的array來代替從方法中返回Null

這個java技巧也是在Joshua Bloch的《Effective Java》所提及的。這本書也是一個提高JAVA編碼能力的一個來源。通過返回一個空的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;

return result;

}

注意:使用Collections.emptyList()生成的List不支援add方法

呼叫Add會丟擲unsupportedException,在以後要返回一個空的List,並還需要後續操作時,不能使用Collections.emptyList()方法,看文件發現,List的實現類都有自己的實現,而返回的EmptyList的實現沒有實現add(int index, E element方法,使用了
AbstractList.add(int index, E element){
    throw new UnsupportedOperationException();
}

類似地你可以使用Collections.EMPTY_LIST, Collections.EMPTY_SET和 Collections.EMPTY_MAP來代替返回Null。

5)使用@NotNull和@Nullable註釋

當寫你可以定義關於約定可空性(Nullability),要通過使用像@NotNull和@Nullable類似的註釋提示這個方法是否為空安全(null safe)。現代的編譯器,IDE和其他工具可以讀出這個註釋來幫你做一個空檢查或者告訴你是否需要空檢查。IntelliJIDE和findbugs 已經支援這種註釋。這些註釋也是JSR 305(譯者注:可以理解為java的標準)的一部分。通過看到@NotNull和@Nullable,程式猿可以自己決定是否去進行空檢查。順便說下,對於JAVA程式猿來說,這是新的最好的實踐,儘管需要一點時間去適應。

6)遵循約定和定義合理的預設值

在java領域,一個最佳的避免空指標的方法之一就是和定下約定和遵守約定。大部分的NullPointException發生原因就是使用了一個不完整的資訊或者並沒有被提供所有的依賴資訊來建立物件。如果你不允許建立不完整的物件和否定任何這種要求,你可以預防很多一段時間之後發生的NullPointException。如果物件被允許建立,那麼你應該設定合理的預設值。例如,一個Employee(僱員)物件不可以在沒有Id和Name屬性的情況下被建立,但可以有一個可供選擇的pghone number(電話號碼)。如果Employee沒有phone number,那麼就用返回一個0來代替返回一個空值。但是這種處理必須非常小心地處理對空值的檢查而不是檢查非法輸入。同樣要注意,定義可以使空值的或者不可以空值的時候,提醒呼叫者作出被告知的決定。失敗之後的選擇或者接受空值也是一個你需要重視的重要設計。

7)資料庫對空值的約束

如果你使用資料庫去儲存你的域物件(demain object),例如:Customer、Orders等等,那麼你應該定義一些在資料庫對空值的約束。因為資料庫可以要求獲得從多個來源來的資料,在資料庫中擁有對空值的檢查將會確保資料的完整性。在資料庫中保留對空值約束的約束也是會讓你減少在JAVA中減少空檢查的程式碼。當從資料庫中取出一個物件是,你可以確保那些屬性可以是空而那些屬性不可以使空,這將會讓那些空檢查的程式碼最小化。

8)使用空物件模式

這是另外一個在JAVA裡面避免NullPointException的方法。如果一個方法返回一個物件,哪個呼叫者要遍歷這個物件,哪個呼叫者就要使用一些類似Collection.iterator()的方法去返回iterator。如果呼叫者沒有任何的上述的這些方法,那麼有可能返回的是空物件而不是空(null)。空物件是一個特別的物件,它在不同的上下文中有不同的含義。像這些返回Contrainter或者Conllection型別的方法的情況中,裡面為空的物件(Empty object)應該被使用而不是返回空。

相關推薦

@NotNull 註解引出的關於Java指標控制

Java 小技巧和在java應用避免NullPonintException的最佳方法 在java應用程式中,一個NullPonintException(空指標異常)是最好解決(問題)的方法。同時,空指標也是寫健壯的順暢執行的程式碼的關鍵。“預防好過治療”這句話

java 指標異常

一、空指標異常產生的主要原因: 1、當一個物件不存在時又呼叫其方法會產生異常obj.method() // obj物件不存在; 2、當訪問或修改一個物件不存在的欄位時會產生異常obj.method() // method方法不存在; 3、字串變數未初始化;  4、介面型別的

java指標異常:java.lang.NullPointException

一.什麼是java空指標異常     我們都知道java是沒有指標的,這裡說的"java指標"指的就是java的引用,我們不在這裡討論叫指標究竟合不合適,而只是針對這個異常本身進行分析。空指標就是空引用,java空指標異常就是引用本身為空,卻呼叫了方法,這個時候就會出現空指標異

關於Java指標異常的幾種情況的總結

1:NullPointerException由RuntimeException派生出來,是一個執行級別的異常。意思是說可能會在執行的時候才會被丟擲,而且需要看這樣的執行級別異常是否會導致你的業務邏輯中斷。  2:空指標異常發生在物件為空,但是引用這個物件的方法。例如: String s =

# Java指標預防

equals方法把確定不是null的作為物件呼叫,儘量當引數而不是物件使用 String s = null; String m = "s"; //true m.equals(s); //false s.equals(m); 在兩者返回相同結果的時候偏向

一個容易忽略的Java指標問題

今天有人提出了程式碼中一個的NullPointException問題。這類問題,很好解決,找到所在行,一看便知。 但是這次,有點意外。拋異常的行,只是一個簡單的Pojo的get、set方法。出錯的行在 a.setSize(b.getSize(

靜態工具類中使用註解注入service 指標

今天在專案中有一個需求,就是在靜態工具類中注入service進行操作,在網上查找了一下,但是一直報空指標異常java.lang.NullPointerException!最後解決了此問題,和大家分

Java指標捕獲

一、空指標異常產生的主要原因如下:1、當一個物件不存在時又呼叫其方法會產生異常obj.method() // obj物件不存在;2、當訪問或修改一個物件不存在的欄位時會產生異常obj.method() // method方法不存在;3、字串變數未初始化; 4、介面型別的物件沒

關於Java指標異常的幾種情況的總結(java.lang.NullPointerException)

在外文網站上看到的: 1. Calling the instance method of a null object.  2. Accessing or modifying the field of 

Spring Dubbo 註解無效,指標

由於將來的專案將使用spring boot技術為主題,這幾天嘗試了一下springboot+dubbo來完成業務架構的分層,這篇文章主要記錄springboot搭建過程中遇到的dubbo空指標問題。 首先建議遇到此問題的通道,看一下這篇文章 http://www.oschi

關於執行緒呼叫Spring註解物件報指標異常

本人剛接觸執行緒方面,今天在寫一個埠監控的時候遇到一個問題,就是線上程中,呼叫spring注入的物件時,報空指標異常. 而且只在這個類中報這個問題. 在controller類中,能正常執行,所以應該能排除注入失敗或者配置錯誤的因素. 百思不得其解,暫時先記下問題,以

打破你的認知!Java指標居然還能這樣玩,90%人不知道…

相信在座的各位都遇到過空指標異常,不甚其煩,本文不是教你避免空指標,而是一些對空指標其他方面的理解。 本文可能有點另類,也可能會打破你對空指標的認知。 ## 1、null.method() 空指標? 我們知道呼叫一個物件的方法,如果物件為 `null` 肯定會報空指標錯誤的,但你確定一定會嗎? 不一定

【Spring錯誤筆記系列】自己new出來的bean中被@Autowired註解修飾的屬性報指標異常:java.lang.NullPointException

自己new出來的bean中被@Autowired註解修飾的屬性報空指標異常 異常描述 原本我再測試RabbitMQ的傳送程式,裡面用到了一個AmqpTemplate介面,用了@Autowired註解。但是當我使用AmqpTemplate的conver

ListView優化時,控制元件行,報指標

 FATAL EXCEPTION: main                                   &n

使用註解方式實現Dubbo搭建,解決消費者呼叫接口出現指標異常以及事務等問題

    最近接手了一個對之前專案進行重構的任務,使用dubbo+maven進行整合,並且將hibernate全部改成JdbcTemplate。主流還是使用springMVC+spring進行開發。 按照之前經驗,使用xml配置方式,釋出服務到zookeeper,成功執

Java物件指標異常

創作不易,請勿抄襲,轉載請註明出處。如有疑問,請加微信 wx15151889890,謝謝。 [本文連結:]https://blog.csdn.net/wx740851326/article/details/https://blog.csdn.net/wx740851326/article

Java中equals方法造成指標異常的原因

問題: 當查詢已修改的與未修改的做比較的時候,之前為null的值呼叫equals方法與其他值做比較的時候,會導致丟擲空指標異常 反思: 為了避免記憶體溢位,我們在無需類外呼叫的方法前,一般不加static關鍵字(因為靜態方法會常駐記憶體,其生存週期與整個專案的生存週期是一致的)所以,我們

Scala操作Hbase指標異常java.lang.NullPointerException處理

Hbase版本:Hortonworks Hbase  1.1.2 問題描述: 使用Scala操作Hbase時,發生空指標異常(java.lang.Runtime

指標異常,算得上是一個簡單低階的錯誤吧 java.lang.NullPointerException: null

#今天早上在寫程式碼的時候突然出現了一個空指標異常,這種空針異常在實際開發過程中是完全可以避免出錯的! 實際部分程式碼如下: @PostMapping("/upload") public RestResult uploadExcelModel(HttpServ

java碎片整理之Boolean變數和null的運算報指標異常

  把Boolean變數的初始為null,在與其他Boolean變數運算時,有以下情況: 1、||運算時,如果Boolean變數值為true並且在左邊,變數值為null型別的在右邊,編譯不會報錯,執行時不會報空指標異常,會輸出左邊的Boolean變數值true,如果Boolean變數值