JUnit测试中的空指针异常

时间:2012-03-24 14:26:53

标签: java junit nullpointerexception

每当我尝试使用JUnit测试我的代码时,我都会收到NullPointerException - 即使我在运行实际程序时没有得到该异常。给我例外的那一行是:

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循环移动到main方法之外,则会出现语法错误 - 我认为您不应该在方法之外使用for循环。所以我不确定如何正确地初始化类以使JUnit工作 - 要么我在main方法之外执行它并得到语法错误,要么我在main方法中执行它并获得NullPointerException。有什么想法吗?

2 个答案:

答案 0 :(得分: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();
    }
  }

  //...
}

这确保在加载类时(即在程序或测试中的任何地方首次使用它之前)正确初始化静态变量。

答案 1 :(得分:3)

Yo可能会找到一些静态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,完全是为了初始化静态变量,尽管它并不常用。