2012-03-24 21 views
1

Immer wenn ich versuche, meinen Code mit JUnit zu testen, erhalte ich eine NullPointerException - obwohl ich diese Ausnahme nicht bekomme, wenn ich das eigentliche Programm ausführe. Die Linie, die mir die Ausnahme gibt, ist:Null-Zeiger-Ausnahme in JUnit-Test

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

Der Beginn der TweetClassification Klasse ist es Tests ist wie folgt:

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 ist eine andere Klasse, die separat in der Verpackung definiert ist.) So Ich stelle fest, dass dieser Code das Array aber nicht seine Mitglieder initialisiert, und das ist wahrscheinlich, warum ich die Ausnahme bekomme (?) Aber die Sache ist, ich initialisiere die Mitglieder des Arrays innerhalb der Hauptmethode von TweetClassification, wie folgt:

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

Aber wenn ich versuche, diese for-Schleife außerhalb der Hauptmethode mit den Konstanten zu verschieben, bekomme ich einen Syntaxfehler - ich nehme an, dass Sie keine for-Schleife außerhalb einer Methode verwenden sollen. Ich bin mir also nicht sicher, wie ich die Klasse richtig initialisieren soll, damit JUnit funktioniert - entweder ich mache es außerhalb der Hauptmethode und bekomme einen Syntaxfehler, oder ich mache es innerhalb der Hauptmethode und bekomme eine NullPointerException. Irgendwelche Ideen?

+0

Bitte zeigen Sie auch den Code innerhalb der 'main' Methode. – Tudor

Antwort

5

Sie müssen den init-Code in ein static initializer block, so bewegen:

public class TweetClassification 
{ 
    //... 

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

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

    //... 
} 

Dies stellt sicher, dass die statische Variable richtig initialisiert wird, wenn die Klasse geladen wird (dh, bevor es zunächst überall in Ihrem Programm verwendet wird, oder Tests).

+0

Danke, Péter! Das war genau das, was ich brauchte. –

3

Yo könnte einige Verwendung des statischen initialzier Block finden:

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 

Das richtige Java und ist genau gemeint statische Variablen zu initialisieren, obwohl es nicht sehr häufig ist benutzt.

Verwandte Themen