2014-11-23 19 views
-2

我有一个类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); 
} 

}

+0

请附上完整的代码和堆栈跟踪 – 2014-11-23 23:14:13

+0

stacktrace告诉你什么? – Reimeus 2014-11-23 23:14:15

+0

没有足够的信息超过一个SWAG,但这里是我的:你可以通过在构造函数中重新声明它来隐藏答案字段吗?如果你这样做,那么你初始化本地变量而不是字段。请改善您的问题,以便我们不必制作SWAG。作为一个方面的建议:不要直接访问对象的字段。而是使用'setXXX(...)','getXXX()'和'addXXX(...)'公共方法。 – 2014-11-23 23:14:20

回答

-1

很好,看不出有什么明显的问题在这里。

不过,我想用“保护”属性在这里不看对我好,建议在问题类说你有:

private ArrayList<Answer> answers = new ArrayList<Answer>(); 
protected ArrayList<Answer> getAnswers(){ 
    return answers; 
} 

在子类TrueFalse,是指通过getter方法

System.out.println(question.getAnswers()); 
question.getAnswers().add(answer); 
+0

不是你的down-voter,但不应该公开getter方法吗? – 2014-11-23 23:28:12

+0

这是如何解决问题的? – 2014-11-23 23:28:59

+0

更改为使用此项,但仍然为空。感谢您的反馈。 – Brejuro 2014-11-23 23:30:40

0

您确定在调查中正确初始化了您的问题对象吗?

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); 

}

+0

是的,我相当新,所以我忘记了实现的最好方法,我试着改变上面的方法,我仍然在同一行上得到相同的异常。感谢您的回应! – Brejuro 2014-11-23 23:49:01

+0

肯定的东西:)你能分享你如何初步化你的调查课题吗? – ymz 2014-11-23 23:52:53

+0

我想我解决了这个问题,但我不确定它为什么有效。你能看看我自己发布的答案吗?谢谢! – Brejuro 2014-11-23 23:53:47

-2

我拿出答案的ArrayList的分配在我问题类,并把它在我取()方法,因为这样的:

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; 

有没有人有一个想法,为什么这解决了它?

相关问题