Java 属性为null,但看起来不应该为空
我有一个类TrueFalse,它扩展了一个类问题 问题具有属性answers,该属性是Answer类型的ArrayList 有人知道为什么吗?谢谢你的帮助 编辑: 我相信这是堆栈跟踪?我是新来的,所以我想这就是我们想要的:Java 属性为null,但看起来不应该为空,java,inheritance,nullpointerexception,null,Java,Inheritance,Nullpointerexception,Null,我有一个类TrueFalse,它扩展了一个类问题 问题具有属性answers,该属性是Answer类型的ArrayList 有人知道为什么吗?谢谢你的帮助 编辑: 我相信这是堆栈跟踪?我是新来的,所以我想这就是我们想要的: null Exception in thread "main" java.lang.NullPointerException at Question.TrueFalse.take(TrueFalse.java:53) at Survey.Survey.take(Survey.
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)
编辑2:
这就是从我的Survey类调用take方法的地方
}嗯,我看不出有什么明显的问题 但是,我认为此处使用的受保护属性在我看来不太好,建议您使用有问题的类:
private ArrayList<Answer> answers = new ArrayList<Answer>();
protected ArrayList<Answer> getAnswers(){
return answers;
}
您确定在调查中正确初始化了问题对象吗
survey.questions.get(i).take(survey.questions.get(i));
一般来说,我不知道这句话的意思是什么。对于我的调查,请从我的问题中选择一个特定的问题,然后使此问题在..上激活方法。。它本身这就是为什么这个关键字是为第一位。。。也许你应该试试:
public void take() {
input = new Input();
answer = new Answer();
System.out.print("Enter Option: ");
int response = input.getIntInput(this.options.size());
answer.setAnswerNumber(response);
System.out.println(this.answers); // NO NEED TO SEND THE QUESTION TO ITSELF
this.answers.add(answer);
}我在我的问题课上拿出答案列表的作业,并将其放在我的take方法中,如下所示:
public void take(Question question) {
input = new Input();
answer = new Answer();
answers = new ArrayList<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);
}
现在的问题是:
public ArrayList<Answer> answers;
有人知道为什么会这样解决吗?请附加完整的代码和stacktrace stacktrace告诉您什么?除了SWAG之外,没有足够的信息,但我的问题是:您是否可以通过在构造函数中重新声明来隐藏答案字段?如果执行此操作,则初始化局部变量,而不是字段。请改进你的问题,这样我们就不必做假货了。附带建议:不要直接访问对象的字段。而是使用setXXX…、getXXX和addXXX。。。公共方法。请发布问题类问题是抽象的-您在扩展问题的具体类中对答案做了什么?您正在声明变量吗?不是您的down投票者,但是getter方法不应该是公共的吗?更改为使用此方法,但是仍然得到null。谢谢你的反馈。是的,我是一个新手,所以我忘记了最好的实现方法,我试着改变到上面的方法,但我仍然在同一行中得到相同的异常。谢谢你的回复!当然可以:你能分享一下你是如何在你的调查课上初始化问题的吗?我想我解决了这个问题,但我不知道为什么它会起作用。你能看看我自己贴的答案吗?谢谢这仅仅说明你没有在c'tor中的问题类中初始化你的答案列表,例如。。。小心-如果您将对每个问题对象多次使用take方法,您将重置问题的当前状态
private ArrayList<Answer> answers = new ArrayList<Answer>();
protected ArrayList<Answer> getAnswers(){
return answers;
}
System.out.println(question.getAnswers());
question.getAnswers().add(answer);
survey.questions.get(i).take(survey.questions.get(i));
public void take() {
input = new Input();
answer = new Answer();
System.out.print("Enter Option: ");
int response = input.getIntInput(this.options.size());
answer.setAnswerNumber(response);
System.out.println(this.answers); // NO NEED TO SEND THE QUESTION TO ITSELF
this.answers.add(answer);
public void take(Question question) {
input = new Input();
answer = new Answer();
answers = new ArrayList<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);
}
public ArrayList<Answer> answers;