我有一个类TrueFalse,它扩展了一个类问题。属性null当它看起来不应该
问题有一个属性答案这是类型回答的ArrayList
protected ArrayList<Answer> answers = new ArrayList<Answer>();
TrueFalse有一个称为取(询问Q),其试图将回答添加方法答案 ArrayList。
这是我的问题 - 答案 ArrayList抛出一个NullPointerException并显示为null。
public void take(Question question) {
input = new Input();
answer = new Answer();
System.out.print("Enter Option: ");
int response = input.getIntInput(question.options.size());
answer.setAnswerNumber(response);
System.out.println(question.answers); // PRINTS NULL
question.answers.add(answer);
}
有没有人有一个想法,为什么?谢谢您的帮助!
编辑:
我相信这是堆栈跟踪?我是相当新的,所以我认为这就是我们正在寻找:
null
Exception in thread "main" java.lang.NullPointerException
at Question.TrueFalse.take(TrueFalse.java:53)
at Survey.Survey.take(Survey.java:239)
at Survey.Main.mainMenuSelection(Main.java:74)
at Survey.Survey.mainMenu(Survey.java:320)
at Survey.Main.mainMenuSelection(Main.java:41)
at Survey.Survey.mainMenu(Survey.java:320)
at Survey.Main.main(Main.java:196)
EDIT2:
这就是take方法被调用,从我调查类。
public void take(Survey survey) {
if (survey.name == null && survey.questions.isEmpty()) {
System.out.println("MESSAGE: Please create/load first.");
mainMenu();
}
System.out.print("Name: ");
System.out.println(survey.name);
for (int i = 0; i < survey.questions.size(); i++) {
System.out.print("\n" + (i+1) + ". " + survey.questions.get(i).questionType + ") ");
System.out.println(survey.questions.get(i).prompt);
for(int j = 0; j < survey.questions.get(i).options.size(); j++) {
System.out.print(j+1 + ". ");
System.out.println(survey.questions.get(i).options.get(j));
}
survey.questions.get(i).take(survey.questions.get(i)); // CALLED HERE
}
System.out.println("Survey complete!");
}
EDIT3:
这里是我的问题类
public abstract class Question implements Serializable {
protected static final long serialVersionUID = 1L;
protected Input input;
protected Answer answer;
protected int optionCount = 0;
public String prompt;
public String questionType;
public ArrayList<String> options;
public ArrayList<String> correctOptions;
public ArrayList<String> matchingOptions;
public ArrayList<Answer> answers;
public Question() {
options = new ArrayList<String>();
correctOptions = new ArrayList<String>();
matchingOptions = new ArrayList<String>();
answers = new ArrayList<Answer>();
}
注:我不是最好的程序员,而不是新的,所以它可能会很邋遢:(
EDIT4:
我的TrueFalse类:
public class TrueFalse extends Question implements Serializable {
private static final long serialVersionUID = 1L;
public TrueFalse() {
questionType = "True/False";
}
@Override
public void addPrompt() {
input = new Input();
System.out.println("Enter the prompt for your True/False question: ");
prompt = input.getStringInput();
}
@Override
public void addOption() {
options.add("True");
options.add("False");
}
@Override
public void addCorrectOption() {
System.out.println("Select correct option: T/F");
String response = input.getStringInput();
while ((!response.toLowerCase().equals("t")) && (!response.toLowerCase().equals("f"))) {
System.out.println("MESSAGE: Enter a valid input.");
}
if (response.toLowerCase().equals("t")) {
correctOptions.add("True");
} else {
correctOptions.add("False");
}
}
public void take(Question question) {
input = new Input();
answer = new Answer();
System.out.print("Enter Option: ");
int response = input.getIntInput(question.options.size());
answer.setAnswerNumber(response);
System.out.println(question.answers);
question.answers.add(answer);
}
}
请附上完整的代码和堆栈跟踪 – 2014-11-23 23:14:13
stacktrace告诉你什么? – Reimeus 2014-11-23 23:14:15
没有足够的信息超过一个SWAG,但这里是我的:你可以通过在构造函数中重新声明它来隐藏答案字段吗?如果你这样做,那么你初始化本地变量而不是字段。请改善您的问题,以便我们不必制作SWAG。作为一个方面的建议:不要直接访问对象的字段。而是使用'setXXX(...)','getXXX()'和'addXXX(...)'公共方法。 – 2014-11-23 23:14:20