尝试打印数组元素时出现Java“NullPointerException”

时间:2014-02-13 16:30:25

标签: java arrays loops

头等舱的第一类

public class JavaMethod {
    public static void main (String[] args){

        JavaMethod javaMethod = new JavaMethod();
        javaMethod.makeChoice();

    }

    public void makeChoice(){
        Scanner console = new Scanner(System.in);

        System.out.println("Enter S, T or C");
        String stc = console.nextLine();

        switch (stc){
            case "S":
                Student student = new Student();
                student.makeChoice();
                break;
            case "T":
                Teacher teacher = new Teacher();
                teacher.makeChoice();
                break;
            case "C":
                College college = new College();
                college.makeChoice();
                break;
            default:
                System.out.println("Invalid");
                makeChoice();
        }
    }
}

存储值的第二类

public class StudentInformation {

    String name;
    String grade;
}

这是我的服务类,我遇到了问题。在运行方法printStudent()时;这个类我得到以下错误:     线程“main”java.lang.NullPointerException中的异常     在STCAssignment.Student.printStudent(Student.java:76)     在STCAssignment.Student.makeChoice(Student.java:31)     在STCAssignment.Student.addStudent(Student.java:66)     在STCAssignment.Student.makeChoice(Student.java:28)     在STCAssignment.JavaMethod.makeChoice(JavaMethod.java:25)     在STCAssignment.JavaMethod.main(JavaMethod.java:12)     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)     在com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

public class Student {

    int i =0;
    StudentInformation[] studentInformation = new StudentInformation[0];



    int makeChoice(){
        Scanner console = new Scanner(System.in);
        i = i +1;
        studentInformation = new StudentInformation[i];

        System.out.println("Do you want to continue(Y/N");
        String yesNo = console.nextLine();

        if (yesNo.equalsIgnoreCase("Y")){
            System.out.println("Add or Print(A/P)");

            String addPrint = console.nextLine();

            if (addPrint.equalsIgnoreCase("A")){
                addStudent();

            } else if (addPrint.equalsIgnoreCase("P")){
                printStudent();

            } else {
                System.out.println("Invalid");
                makeChoice();
            }

        }else if (yesNo.equalsIgnoreCase("N")){
             System.exit(0);
        } else {
            System.out.println("Invalid");
            makeChoice();
        }

        return i;

    }

    public void addStudent(){
        int i = 0;

        StudentInformation info = new StudentInformation();
        Scanner console = new Scanner(System.in);

        System.out.println("Enter Students name");
        info.name = console.nextLine();
        studentInformation[i]=info;


        System.out.println("Enter Students grade");
        info.grade = console.nextLine();
        studentInformation[i]=info;

        i = i + 1;
        makeChoice();
    }

    public void printStudent(){

        for (int j =0; j<studentInformation.length; j++){
            StudentInformation info = studentInformation[j];

            System.out.println("Student name:"+info.name);
            System.out.println("Student grade:"+info.grade);
        }

        makeChoice();
    }
}

如何解决?

4 个答案:

答案 0 :(得分:1)

由于String name为null,如果在初始化之前尝试使用它,它将抛出NPE。用户可以在“制作”Student之前首先打印学生的信息。您实例化了一个Student对象,但是在打印时没有为name赋值,因为这是您打印的第一件事,它会在它到达其余打印代码之前抛出一个NPE。在打印或尝试打印任何内容之前,您可以在此处查看是否name或您班级的任何其他字段null

您还首先实例化一个空的StudentInformation类,然后创建另一个类。因此,两个StudentInformation对象可能为空。

这里:

StudentInformation[] studentInformation = new StudentInformation[0];

这里:

Scanner console = new Scanner(System.in);
i = i +1;
studentInformation = new StudentInformation[i];

答案 1 :(得分:1)

阅读完您的说明后:

  1. 输入选择学生,教师或学院的信息进行添加。
  2. 那么你想继续(y / n),再次接受输入。
  3. 再次询问输入是否要在学生,学院或教师中添加或打印。
  4. 再次添加或打印后询问是否要继续(是/否)。
  5. 我支持我先前的评论,即您的代码偏离基础。我建议你:

    1. 创建一个学生课程,旨在保存单个学生的信息,他的姓名,可能是身份证号码,成绩或其他任何需要的内容。
    2. 给它一个构造函数将这些信息传递给类。
    3. 给它getter方法,也许是setter方法。
    4. 不要给它一个StudentInformation数组或任何与单个学生无关的字段。
    5. 在您的Driver类中执行所有输入输出和Scanner的使用,使用main方法。

      • 也许您的StudentInformation类应该重命名为Student。
      • 您的驱动程序类,然后与用户进行交互的人可能应该List<Student>初始化为ArrayList<Student>。它应该有一个类似的教师名单。
      • 您的学生班级不应该有一个数组,其中包含您当前代码所关注的其他学生的信息。
      • 您当前的代码会重新创建一个新的Student类,每次运行时都会重新创建其数组,因此存储在数组中的所有先前信息都将丢失,但这样做无法正常工作。
      • 再次,你应该重新开始。

答案 2 :(得分:1)

每次创建new StudentInformation[i]时,都会覆盖最后一个学生信息数组,但不会复制其值。

这意味着您的makeChoice()变量的第一个studentInformation将包含:

[StudentInformation<--some data-->]

第二次调用makeChoice()后,它将包含:

[null, StudentInformation<--new data-->]

第十次通话后会是:

[null, null, null, null, null,...,StudentInformation<--some new data-->]

然后,当你打印它时,它会导致NLE。

答案 3 :(得分:0)

检查info.nameinfo.grade是否为空指针:

if (info != null) {
    System.out.println("Student name:"+info.name);
    System.out.println("Student grade:"+info.grade);
} else System.out.println("Student information is null.");

另一种可能性是名称和等级未初始化。确保对StudentInformation的所有对象执行此操作,例如声明它们时将它们设置为默认值。