头等舱的第一类
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();
}
}
如何解决?
答案 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)
阅读完您的说明后:
我支持我先前的评论,即您的代码偏离基础。我建议你:
List<Student>
初始化为ArrayList<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.name
或info.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的所有对象执行此操作,例如声明它们时将它们设置为默认值。