2014-10-09 105 views
0

因此,通過幾個基於Java的Web應用程序,我在絕大多數Web應用程序中意識到了一個共同點。他們中的大多數往往運行良好,直到你面對面與Null Pointer Exception.下面是該返回錯誤的方法之一:
處理空指針異常

public Map getWebSiteObjects(String path, LightWeightNode root, Integer versionId, Site site) { 


     Map webSiteObjects = new HashMap(); 

     // refresh site 
     site = (Site)getObject(Site.class, site.getId()); 

     webSiteObjects.put("site", site); ...... /* Dont worry about the rest */ 

方案:此方法在我的應用程序生成的樹,但是,它的在運行時給一個空指針異常:

2014-10-09 12:00:18,674 ERROR org.springframework.web.servlet.DispatcherServlet - Could not complete request 
java.lang.NullPointerException at com.bsdeurope.xmlcms.service.impl.TreeManagerImpl.getWebSiteObjects(TreeManagerImpl.java:159) 

現在我有一些Java校長(基本面)和我的想法來解決這個很新是初始化4個變量的方法傳遞,因此有:

path = null; 
root =null; 
versionId = null; 
site = null; 

之前getWebSiteObjects方法中的任何指令。現在我知道這可能不是唯一的解決方案,但我的問題是:

1)什麼是防止Java的好方法Null Pointer Exceptions
2)如果有一個過程,你會怎麼做呢?

通常,當您處理很多類時,尤其是那些代碼寫得很糟糕的應用程序時,當您在左側,右側和中間出現大量空指針異常時,最終會碰撞牆。

+2

一個Java開發誰不處理或得到NPE就像一條沒有水的魚。這是一個非常廣泛的問題,可以有多種解決方案和建議。我建議你在繼續之前閱讀異常處理,特別是NPE處理。 – vikeng21 2014-10-09 11:30:54

回答

2

對此有兩種思想流派。

一所學校說,爲null測試,並做一些「做好」。例如,將其替換爲其他內容,忽略它,寫入日誌消息等。

另一派是一個意外null是一個BUG,並做正確的事情是允許拋出了NullPointerException。然後,您允許NPE傳播並(理想情況下)導致程序崩潰......或者更好,但在將NPE堆棧跟蹤記錄到應用程序的日誌文件中後,它會優雅地失敗。

然後,程序員可以使用堆棧跟蹤中的信息(和「那些小灰色單元格」引用一位知名的虛構比利時偵探)來找出意外的null來自何處,並修復根問題的原因。通常這需要找到字段或數組元素或任何不正確初始化的,get調用返回null來指示(軟)失敗,或其他。此修復可能涉及對null進行測試,或者可能涉及初始化某些內容,傳遞某些內容或更正某些邏輯,或者在程序中添加前面的測試。

國際海事組織,在所有地方加入防禦性測試null的做法是一個壞主意。它傾向於用另一種往往難以追蹤的種類替換一種錯誤(一種NPE)。


所以我的答案是:

1) What is good practice in terms of preventing Java Null Pointer Exceptions?

良好做法是不避免在NPE。相反,讓他們發生,並找到/修復引入虛假null值的內容。

2) If there is a procedure how would you go about doing it?

不,沒有。當然有沒有程序,>>我< <將使用。

我唯一要做的是儘量讓我的代碼拋出NPE 較早,使null不會獲得通過從其原始來源很長的路要走。 (這往往更容易發現和解決問題的根本原因。)

2

空檢查通常就足夠了。

// refresh site 
    if(site!=null){ 
     site = (Site)getObject(Site.class, site.getId()); 
     webSiteObjects.put("site", site); ...... /* Dont worry about the rest */ 
    }else{ 
     // Print an error message, or do the error handling here... 
    } 

請注意,NullPointerException只會出現在您的表達式求值爲null.someFunction()時。在這個例子中,site.getId()。所以空檢查只有site!=null就夠了。如果您有更多的object.someFunction()那麼你可能要爲你的程序在這裏做這樣的事情

if(obj1!=null && obj2!=null){ 
    // Safe to call 
    obj1.function(); 
    obj2.function(); 
} 
+0

檢查所有參數傳入的值是否爲空值。在我的方法的情況下,所有四個參數?如果(路徑|| root || site || versionId!= null){...}是一個有效的序列嗎? – Arty 2014-10-09 11:36:08

+1

@Arty:當你嘗試編譯時你會看到。嘗試類似'if(path!= null || root!= null){...}' – Niroshan 2014-10-09 12:00:57

1

是一個簡單的空檢查:

public Map getWebSiteObjects(String path, LightWeightNode root, Integer versionId, Site site) { 


     Map webSiteObjects = new HashMap(); 
     if(null!=Site){ 
     // refresh site 
     site = (Site)getObject(Site.class, site.getId()); 

     webSiteObjects.put("site", site); ...... /* Dont worry about the rest */ 
     } 
    //Similarly while using other arguments do similar null check 
    (if null!=path){ 
    /* 
    Your code here... 
     */ 
    } 
} 

對於最佳做法,以避免NPE檢查此鏈接:NPE practices

1

你可以把任何方法的所有業務邏輯在try塊

try{ 
Map webSiteObjects = new HashMap(); 
// refresh site 
site = (Site)getObject(Site.class, site.getId()); 
webSiteObjects.put("site", site); ...... /* Dont worry about the rest */ 
}catch(NullPointerException e){ 
// error occured 
e.printStackTrace(); 
} 
+0

壞主意。你已經寫了一個堆棧跟蹤的地方,它可能不會被注意到......然後繼續運行*,就好像剛剛發生的一切都是一樣的*! – 2014-10-09 11:54:01

+0

它是讓你知道發生異常的地方。它沒有任何中斷程序流程。如果你不想讓你的代碼崩潰,也是安全的。 NPE是運行時異常,應始終保持謹慎。這是我對你的兩個學校概念@StephenC的想法 – 2014-10-09 12:41:03