public class StudentSchedular {
private Student[] students=new Student[10];
private int counterStudent;
public String addStudent(int rollNumber,String name)
{
students[counterStudent++]=new Student(rollNumber,name);
return "Student added successfully";
}
public void showAllStudents()
{
for(int i=0;i<students.length;i++){
System.out.println(students[i].getRollNumber());
System.out.println(students[i].getName());
}
}
}
我知道这是一个菜鸟问题..但仍然! 这里我省略了其他getter / setter部分以及我输入rollnumber和name的值的其他情况。我试图打印对象数组,但它给出一个空指针异常。我只输入2 3个值,当我尝试打印时,它会给出NPE。我知道这是因为空值在剩余的索引位置,我只需要一个soln来打印整个对象数组!
答案 0 :(得分:1)
您获得NullPointerException
的原因是private Student[] students=new Student[10];
。这意味着您有一个Student
数组,其大小固定为10. Java中的默认Object
值为null
。如果不向数组添加任何内容,则意味着学生中有10个null
个对象。
如果学生数组中的偏移量尚未填充,您将获得空值并获得异常,因为您尝试在null
上调用方法。
您可以在循环中验证它:
for(int i=0;i<students.length;i++){
if(students[i] instanceof User) {
System.out.println(students[i].getRollNumber());
System.out.println(students[i].getName());
}
}
编辑:使用List<User>
代替User[]
可以避免此“问题”。但如果它更有意义,我无法决定你。
答案 1 :(得分:1)
我更喜欢新的 For循环(自Java 5起)。
for(Student student : this.students) {
}
新的for循环适用于arrays and all iterables objects, like ArrayList。您将只获得非空对象。
要回答您的问题,最佳做法是:
覆盖学生对象中的toString()。
@Override
public void String toString(){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(this.rollNumber);
stringBuilder.append(this.name);
return stringBuilder.toString();
}
在你的循环中,只需做
System.out.println(stundents[i]);
println 可以根据需要处理空值,并且代码变得干净。
答案 2 :(得分:0)
你的阵列有10个插槽。如果给出3个值,那么你有7个空值的插槽。您需要更改正在使用的数据结构类型,或在打印时检查空值。下面的代码将进行空检查,然后打印数组中的哪个索引包含空值。
public void showAllStudents()
{
for(int i=0;i<students.length;i++)
{
if(students[i] != null) {
System.out.println(students[i].getRollNumber());
System.out.println(students[i].getName());
}
else
{
System.out.println("Array is null at index: " + i);
}
}
}