Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 例外,建议?_Java_Pointers_Inheritance_Nullpointerexception - Fatal编程技术网

Java 例外,建议?

Java 例外,建议?,java,pointers,inheritance,nullpointerexception,Java,Pointers,Inheritance,Nullpointerexception,我正在学习电子书BigJavaLateObjects,我在解决其中一个任务时遇到了问题。这是关于继承的。有一个问题类和一个扩展它的子选项问题类 但是当我在testclass中运行代码时,它会调用null异常,我不知道为什么 Exception in thread "main" java.lang.NullPointerException at ChoiceQuestion.addChoice(ChoiceQuestion.java:12) at TestClass.main(TestClass.

我正在学习电子书BigJavaLateObjects,我在解决其中一个任务时遇到了问题。这是关于继承的。有一个问题类和一个扩展它的子选项问题类

但是当我在testclass中运行代码时,它会调用null异常,我不知道为什么

Exception in thread "main" java.lang.NullPointerException
at ChoiceQuestion.addChoice(ChoiceQuestion.java:12)
at TestClass.main(TestClass.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at                  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
以下是我的课程:

public class Question {
private String text;
private String answer;

/**
 *  Constructs a queston with empty question and answer.
 */
public Question(){
    text = "";
    answer = "";
}
//=============Setter methods============
public void setText(String questionText){
    text = questionText;
}

public void setAnswer(String correctResponse){
    answer = correctResponse;
}
//==============Getter Methods=============
public boolean checkAnswer(String response){
    return answer.equals(response);
}
public void display(){
    System.out.println(text);
}
}
下面是我的子类:

class ChoiceQuestion extends Question {
private ArrayList<String> choices;


//=========Methods==============
public void addChoice(String choice,boolean correct){
    choices.add(choice);
    if(correct){
        //convert choices.size() to string
        String choiceString = "" + choices.size();
       this.setAnswer(choiceString);
    }
}

public void display(){
    // Display the question text
    super.display();
    // Display the answer choices
    for(int i=0;i<choices.size();i++){
        int choiceNumber = i + 1;
        System.out.println(choiceNumber + ": " + choices.get(i));
    }
}
}

对象
选项
从未初始化

在Java中,必须先初始化对象,然后才能使用它们。这就是为什么尝试调用
choices.add(choice)
会产生这样的异常

在构造函数中初始化成员对象通常是个好主意

在这种情况下,您似乎应该为
ChoiceQuestion
编写一个构造函数,并在那里初始化
选项

class ChoiceQuestion extends Question {
    private ArrayList<String> choices;

    ChoiceQuestion(){
        choices = new ArrayList<>();
    }

   //...
类选择问题扩展问题{
私人ArrayList选择;
选择问题(){
choices=newarraylist();
}
//...

对象
选项
从未初始化

在Java中,必须先初始化对象才能使用它们。这就是为什么尝试调用
choices.add(choice)
会产生这样的异常

在构造函数中初始化成员对象通常是个好主意

在这种情况下,您似乎应该为
ChoiceQuestion
编写一个构造函数,并在那里初始化
选项

class ChoiceQuestion extends Question {
    private ArrayList<String> choices;

    ChoiceQuestion(){
        choices = new ArrayList<>();
    }

   //...
类选择问题扩展问题{
私人ArrayList选择;
选择问题(){
choices=newarraylist();
}
//...

编写私有ArrayList选项=新建ArrayList()


在声明它时在类中。

编写私有ArrayList选项=新建ArrayList()


声明列表时在类中。

使用前需要初始化列表:

private List<String> choices = new ArrayList<String>();
private List choices=new ArrayList();

使用前需要初始化列表:

private List<String> choices = new ArrayList<String>();
private List choices=new ArrayList();

选项
成员从未初始化,因此第一次尝试访问它时,您会失败,出现
NullPointerException
。例如,您可以在类定义中初始化它:

class ChoiceQuestion extends Question {
    private ArrayList<String> choices = new ArrayList<>();
    // Rest of the class
类选择问题扩展问题{
私有ArrayList选项=新建ArrayList();
//班上其他同学

选项
成员从未初始化,因此第一次尝试访问它时,您会失败,出现
NullPointerException
。例如,您可以在类定义中初始化它:

class ChoiceQuestion extends Question {
    private ArrayList<String> choices = new ArrayList<>();
    // Rest of the class
类选择问题扩展问题{
私有ArrayList选项=新建ArrayList();
//班上其他同学

您似乎没有创建
选项
instancechoices为null。您在哪里为Arraylist创建了一个对象。您正在执行选项。add(choice)只不过是null。add(choice)因此,NPE。在添加之前,首先创建ArrayList choices对象。似乎您没有创建
choices
instancechoices。您在哪里为ArrayList创建了一个对象。您正在执行choices。add(choice)只不过是null。add(choice)所以是NPE。在添加之前先创建ArrayList choices对象是的,现在有意义了!非常感谢broncoAbierto!:PYes,现在有意义了!非常感谢broncoAbierto!:P非常感谢Sunny!非常感谢Sunny!非常感谢Sanjeev!非常感谢Sanjeev!非常感谢Mureinik!非常感谢穆雷尼克!