显示对象数组的结果

时间:2016-10-16 14:12:06

标签: java arrays object for-loop nullpointerexception

这个类编译得很好:

public class Student{
//define variables
static String name;

//define constructor
public Student(String n){
    name = n;
}

//define method to display name
public static void displayStudent(){
    System.out.println("Name: " + name);
}
}

这是我尝试调用displayStudent()方法的类,但是我收到来自for loop的java.lang.NullPointerException异常:

public class MyClass{

//define array of object Student
private Student[] students;

//constructor
MyClass(int size){
Student[] students = new Student[size];
}

    //define method to display the students variable
public void displayAllStudents(){
    for (int i = 0; i <= students.length; i++){
        students[i].displayStudent();
    }
}

我正在尝试用Eclipse修复它,但它说在MyClass中“不使用局部变量students的值”。我的错误在哪里?

4 个答案:

答案 0 :(得分:2)

您在这里创建一个局部变量

MyClass(int size){
    // only exists inside this scope.
    Student[] students = new Student[size];
}

但这对于这个构造函数是本地的,所以你马上扔掉它。我假设您打算设置字段 students

MyClass(int size) {
    students = new Student[size];
}

注意:所有这一切都是创建一个对学生的引用数组,这些引用都是null。所以你还需要为每个索引创建一个Student对象

MyClass(int size) {
    students = new Student[size];
    for (int i = 0; i < size; i++)
        students[i] = new Student();
}

注意常见模式如何使用<而非<=您的打印循环必须是

for (int i = 0; i < students.length; i++){

for (int i = 0; i <= students.length-1; i++){

索引从0开始,如果您有n个元素,则最后一个元素为n-1

P.S。 你可能并不是说变量“name”是静态的。 通过使其成为静态,“Student”的所有实例将共享相同的名称。

答案 1 :(得分:1)

这是因为该数组大小 将该代码更改为

public void displayAllStudents(){ for (int i = 0; i < students.length; i++){ students[i].displayStudent(); } }

如果一个数组有3个元素array.length函数返回3.你从0,1,2,3 yaa计算它有4个数字。它将返回数组outof bound异常或nullpointer异常。

答案 2 :(得分:1)

请参阅解决方案的链接: https://github.com/omkar-nibandhe/StackOverflowSolutions/commit/c7aa250caeeed6a3827e0579b174aae59d4f9c22

在您的班级中进行了更改:“MyClass”用于学生[]的声明部分。

- 您正在调用具有数组大小的构造函数,因此使用您选择的大小初始化Student [](在这种情况下硬编码为10)。

希望这会对你有所帮助。

答案 3 :(得分:0)

我们可以看到你正在使用学生数组,但你没有调用学生类的构造函数(带参数),因此它们在名称字段中包含null作为存储值,并为您提供空指针异常。

   class MyClass{

//define array of object Student
private Student[] students;

//constructor
MyClass(int size){
Student[] students = new Student[size];
}

    //define method to display the students variable
public void displayAllStudents(){
    for (int i = 0; i <= students.length; i++){
        students[i].displayStudent();//this will give null pointer execption because student 
        // objects are not inisialised and cointains null 
    }
}
}

但是这段代码不会给出空指针异常。

    class MyClass{

//define array of object Student
private Student[] students;

//constructor
MyClass(int size){
Student[] students = new Student[size];
for(int i=0;i<size;i++){
     students[i]=new Student("the string value");
}
}

    //define method to display the students variable
public void displayAllStudents(){
    for (int i = 0; i <= students.length; i++){
        students[i].displayStudent();
    }
}
}