2012-03-24 162 views
1

每當我嘗試使用JUnit測試我的代碼時,我都會收到一個NullPointerException異常 - 即使我在運行實際程序時沒有得到該異常。這給了我異常的行是:JUnit測試中的空指針異常

assertEquals(0.0, TweetClassification.tweetType[TweetClassification.SIGNIF_OTHER].likelihoodA); 

的TweetClassification類的開始它的測試如下:

public class TweetClassification 
{ 

// CONSTANTS ============================================= 
public static final int TCNUMBER = 5; // number of TweetCategories (including the null category) 

// using constants to indicate the names of the TweetCategories, so that they could be renumbered 
public static final int NULLTWEET = 0; 
public static final int SIGNIF_OTHER = 1; 
public static final int FRIENDS = 2; 
public static final int WORK = 3; 
public static final int FOOD = 4; 

public static final TweetCategory[] tweetType = new TweetCategory[TCNUMBER]; 
... 

(TweetCategory是包內的單獨定義的另一個類。)所以,我意識到這個代碼初始化數組,但不是它的成員,這可能是爲什麼我得到異常(?)但事情是,我初始化的TweetClassification主要方法中的數組成員,如下所示:

for (int i=0; i<TCNUMBER; i++) 
{ 
tweetType[i] = new TweetCategory(); 
} 

但是,如果我嘗試將這個循環移到主方法之外的常量,我得到一個語法錯誤 - 我認爲你不應該在方法外使用for循環。所以我不確定如何正確地初始化JUnit以使其正常工作 - 或者我在主方法之外執行並獲得語法錯誤,或者我在主方法內部執行該操作並獲得NullPointerException。有任何想法嗎?

+0

請在'main'方法中顯示代碼。 – Tudor 2012-03-24 14:30:00

回答

5

您需要的初始化代碼移到一個static initializer block,像這樣:

public class TweetClassification 
{ 
    //... 

    public static final TweetCategory[] tweetType = new TweetCategory[TCNUMBER]; 

    static 
    { 
    for (int i=0; i<TCNUMBER; i++) 
    { 
     tweetType[i] = new TweetCategory(); 
    } 
    } 

    //... 
} 

這保證了當類加載的靜態變量正確初始化(即之前,你的程序中第一次使用任何地方或測試)。

+0

謝謝,佩特!那正是我需要的。 – 2012-03-24 17:09:10

3

喲,可能會發現一些使用靜態initialzier塊:

private static Integer arr[] = new Integer[2]; 
static { 
    for (int i = 0; i < 2; i++) { 
     arr[i] = 2; 
    } 
} 
public static void main(String[] args) { 
    System.out.println(arr[1]); 
} 

。OUPUTS:

2 

這是正確的java和正好意味着初始化靜態變量,雖然不是很普遍用過的。