отображение результатов из массива объектов

#java #arrays #object #for-loop #nullpointerexception

#java #массивы #объект #for-цикл #исключение 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() метод, но я получаю java.lang.Исключение NullPointerException, исходящее из for loop :

 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 не используется». В чем моя ошибка?

Комментарии:

1. Вы создаете массив, но еще не заполняете его объектами, как вы выясняете, у него есть только нулевые ссылки. Сначала заполните каждый элемент массива new Student(...) , прежде чем пытаться его использовать.

Ответ №1:

Здесь вы создаете локальную переменную

 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. @Radik Это действительно должен быть комментарий к вопросу.

2. @sirio Если этот ответ решил вашу проблему, пожалуйста, отметьте его как правильный ответ. Это связано с тем, что все сообщения в Stack Overflow предназначены для того, чтобы быть полезными и для будущих посетителей, а сообщения с принятыми ответами обязательно будут более полезными.

Ответ №2:

Именно из-за того, что размер массива изменяет этот код на

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

если в массиве есть 3 элемента, функция array.length возвращает 3. И вы считаете это от 0, 1, 2,3 yaa есть число 4. он вернет исключение array outof bound или исключение nullpointer .

Комментарии:

1. да, как только я это исправил, я получил Arrayoutofbounds, поэтому я исправил это с students.length -1 помощью и теперь работает. Спасибо!

Ответ №3:

Смотрите Ссылку для решения: https://github.com/omkar-nibandhe/StackOverflowSolutions/commit/c7aa250caeeed6a3827e0579b174aae59d4f9c22

В ваш класс внесены изменения: «MyClass» для части объявления Student[] .

-Вы вызываете конструктор с размером массива, поэтому инициализируйте Student[] с выбранным вами размером (в данном случае жестко заданным до 10).

Надеюсь, это вам поможет.

Комментарии:

1. Вы должны включить свой код здесь, а не по ссылке.

2. извините. это мой 1-й пост. позаботится об этом в следующий раз.

Ответ №4:

Как мы видим, вы используете массив students, но вы не вызываете конструктор класса student (с аргументом), и, следовательно, они содержат null в качестве сохраненного значения в поле name и дают вам исключение нулевого указателя.

    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();
    }
}
}