オブジェクトを作成してArrayListに追加しようとしています。コードは次のようになります。
class B{
public ArrayList<Answer> answerList = new ArrayList<Answer>();
questionList.add(new EssayQuestion());
answerList.add(new StringAnswer());
}
Exception in thread "main" java.lang.NullPointerException
at main.Test.createNewQuestion(Test.java:31)
at main.Survey.<init>(Survey.java:21)
at main.Test.<init>(Test.java:9)
at main.MainDriver.main(MainDriver.java:35)
そしてデバッガーでは、クラッシュの直前にこれが表示されます。
Thread.dispatchUncaughtException(Throwable) line: not available
でクラッシュし
answerList.add(new StringAnswer());
ていて、理由がわかりません。
関連する場合、questionListは、このコードチャンクが存在するスーパークラスで初期化されます。保護されているのでアクセスしています。answerListはローカルで作成されます。
StringAnswerのコンストラクターは、ユーザーに文字列を要求し、スキャナーを介してそれを読み取ります。EssayQuestion()のコンストラクターは非常に似ています。
何か案は?
編集:ここに要求されたいくつかのコードがあります。はい、answerListは、初期化された後、何かが追加される前にnullとして表示されます。それが問題ですか?なぜそれが起こっているのですか?繰り返しになりますが、questionListはこの親クラスで宣言および初期化されるため、再宣言または初期化しないで問題ありませんか?
public class Test extends Survey
{
public ArrayList<Answer> answerList;
public Test()
{
answerList = new ArrayList<Answer>();
System.out.print("How many questions? ");
int numQuestions = kb.nextInt();
for (int i = 0; i < numQuestions; i++)
{
displayMenu();
createNewQuestion();
}
}
public void createNewQuestion()
{
int input = -1;
do{
System.out.print("Question Type: ");
input = kb.nextInt();
System.out.println();
switch (input)
{
case 1: questionList.add(new EssayQuestion());
answerList.add(new StringAnswer());
break;
そしてここにStringAnswerがあります:
public class StringAnswer extends Answer
{
String text;
public StringAnswer()
{
setAnswer();
}
public StringAnswer(String text)
{
this.text = text;
}
@Override
public void display()
{
System.out.println(text);
}
public String getAnswer()
{
return text;
}
@Override
public void setAnswer()
{
System.out.print("Enter Answer: ");
setAnswer(kb.nextLine());
System.out.println("");
}
public void setAnswer(String text)
{
this.text = text;
}
}