Исключение нулевого указателя в тесте JUnit - PullRequest
1 голос
/ 24 марта 2012

Всякий раз, когда я пытаюсь протестировать свой код с помощью 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 - это еще один класс, который определяется отдельно в пакете.) Поэтому я понимаю, что этот код инициализирует массив, но не его члены, и, вероятно, поэтому я получаю исключение (?) Но дело в том, что я выполнить инициализацию членов массива в методе main класса TweetClassification следующим образом:

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

Но если я попытаюсь переместить цикл for за пределы основного метода с константами, я получу синтаксическую ошибку - я предполагаю, что вы не должны использовать цикл for вне метода. Поэтому я не уверен, как правильно инициализировать класс для работы JUnit - либо я делаю это вне метода main и получаю синтаксическую ошибку, либо я делаю это внутри метода main и получаю исключение NullPointerException. Есть идеи?

Ответы [ 2 ]

5 голосов
/ 24 марта 2012

Вам нужно переместить код инициализации в блок статического инициализатора , например, так:

public class TweetClassification
{
  //...

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

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

  //...
}

Это гарантирует, что статическая переменная инициализируется правильно, когдакласс загружается (т. е. перед его первым использованием где-либо в вашей программе или тестах).

3 голосов
/ 24 марта 2012

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 и предназначен именно для инициализации статических переменных, хотя этоне очень часто используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...