2012-03-24 19 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のmainメソッド内で配列のメンバーを初期化する:

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

しかし、これをメインメソッドの外側で定数の外側に移動しようとすると、構文エラーが発生します。メソッドの外側でforループを使用することは想定されていません。だから私はJUnitを正しく動作させるためにクラスを正しく初期化する方法がわかりません。メインメソッドの外で文法エラーを出すか、mainメソッドの中でそれを行い、NullPointerExceptionを取得します。何か案は?

+0

'main'メソッドの中にコードを表示してください。 – Tudor

答えて

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

ありがとう、ペーター!それはまさに私が必要としたものでした。 –

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のであり、それは非常に一般的ではないですが、静的変数を初期化するために、正確に意味されます中古。

関連する問題