2017-04-07 65 views
1

當我使用JUnit測試來檢查我的編碼過程時,我發現有些問題打擾了我。 例如:我應該多關注NullPointerException嗎?

List<User> list = userDao.findBy("id",id); 
list.get(0).getName(); 

存在的疑難問題。沒有使用任何斷言檢查列表不爲空,使用它可能會導致NullPointException.but看業務邏輯之前。

當我創建一個像這樣的新用戶。

if(user!=null){ 
    userDao.save(user) 
} 

應不null.because我檢查用戶不爲空時,我加一個,所以我肯定知道用戶是成功的在數據庫中。

如果我增添了不少的這個時候,我得到了用戶:

if(list!=null||list.size()>0){...}; 

在類似的地方,使代碼陷入混亂。

我應該添加與否?如何做出選擇?無論如何,這個thx是不可能的。

+0

我覺得沒有你不應該因爲單元測試測試了代碼塊的邏輯正在按預期工作,您應該檢查那只是在您的代碼 –

+0

對不起,我沒有明確表達,我的意思是當我編寫JUnit測試時,我發現我的代碼有問題,而不是int單元測試代碼 – kevin

+0

是的,我知道了,只要使用前提條件並檢查前提條件 –

回答

0

我認爲你要找的是方法preconditions或者更一般地說contracts

讓我們假設你的代碼是分裂成許多小的方法,因爲它應該是。然後你爲每種方法定義先決條件和後置條件。這些都需要得到滿足,否則就會失敗。如果你一直這樣做,那麼把這些檢查放在哪裏的問題將以相當直觀的方式回答自己。

舉個例子,讓我們考慮兩種方法,你可以寫做了一個User的方法:

private void doSomethingWithUser(User u) { 
    if (u == null) { 
    /* take appropriate steps */ 
    } 
    /* perform some action on the user object */ 
} 

以上,該方法以零檢查的護理。因此,調用代碼不需要這樣做。

/* 
* Does this and that with the User. 
* Precondition: the User `u` may not be null! 
*/ 
private void doSomethingWithUser(User u) { 
    /* perform some action on the user object */ 
} 

這裏,該方法不檢查unull,但閱讀的評論,我們可以看到,這是該方法是如何設計的。調用代碼的責任是交出一個非空對象,否則行爲將是未定義的。

當然,現在你面對的時候與這些去的決定。顯然,您可以爲您的方法設置先決條件,讓他們仍然執行適當的檢查。然後他們可以返回一個表示錯誤的值或拋出一個異常,這很常見。

編輯:

但如果有大量的對象需要檢查之前,我使用他們,我應該檢查他們所有?

考慮一下:

public class SimpleClass { 
    public static void main (String[] args) { 
    User sware = new User("sware"); 
    User domdom = new User("domdom"); 

    doSomethingWithUser(sware); 
    doSomethingWithUser(domdom); 
    } 
} 

在這裏,我們宣佈main方法的初始化兩個對象。我們知道他們不是零。然後,我們馬上使用它們。無論該方法是否檢查null,我都不會在外面執行這樣的檢查 - 這些對象只是null

現在,假設我們有一個更復雜的代碼:

public class VeryComplexClass extends ComplexClass implements ComplexInterface { 
    /* ... */ 
    @Override 
    private boolean doSomethingWithUser(User u) { 
    if (u == null) { 
     return false;  
    } 
    /* ... */ 
    } 
} 

比方說,我們需要實現doSomethingWithUser()方法來滿足該接口。或者方法來自父類,我們覆蓋它。我們不知道u將來自哪裏。誰可能會調用這種方法?來自課堂外的用戶?或者這個方法是由這個類本身使用的?會傳入一個成員來調用它嗎?這一點很難說。因此,我會建議將null檢查到位。

+0

我真的依賴於你的代碼,以及你是多麼的偏執。如果你聲明並初始化一些對象然後使用它,我沒有看到你應該檢查null的原因。然而,一旦你開始遞交物體,它可能很快就會變得相當混亂,因爲那個物體來自它或者它可能被操縱的地方。然後相應地對其執行檢查是有意義的。 – domsson

+0

謝謝你的回答,我明白了。 – kevin

+0

用一個奇怪的例子更新了答案。希望它是有道理的。 – domsson

0

正如你已經檢查了用戶爲是空的,我不認爲有必要爲你擔心NullPointerException..Just與該代碼繼續

+0

是的,這就是我想知道的,thx – kevin