每当我尝试使用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。有什么想法吗?
答案 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,完全是为了初始化静态变量,尽管它并不常用。