Исключение нулевого указателя в Java, несмотря на инициализацию варибала - PullRequest
0 голосов
/ 06 августа 2020
public class GradeClass {

    String nameF;
    int[] gradesF = new int[4];
    float average;

    public GradeClass(String name, int grade1, int grade2, int grade3, int grade4) {
        nameF = name;
        gradesF[0] = grade1;
        gradesF[1] = grade2;
        gradesF[2] = grade3;
        gradesF[3] = grade4;
    }
    
    public float getAverage() {
        average = (gradesF[0] + gradesF[1] + gradesF[2] + gradesF[3] / gradesF.length);
        return average;
    }
    
        // Used to reference number of sides used in current state of die.
    public String getName() {
        return nameF;
    }
    
        // Used to reference number of sides used in current state of die.
    public int[] getGrades() {
        return gradesF;
    }   

}

   else if (a == 2) {
                 System.out.println("Enter name of  "+ (a+1)  +" person. :: ");
                    nameI = keyboard.next();
                    
                    while (size < 1 || size > 4 ) {
                    System.out.println("How many grades would you like to enter? 'Max-4' :: ");
                    size = keyboard.nextInt();
                    }
                    
                    while (gradeArray[b] > 1 || gradeArray[b] > 100 ) {
                        System.out.println("Enter the " + size + " grades here :: ");
                         for(b=0; b<size; b++) {
                             gradeArray[b] = keyboard.nextInt();
                     }
                  GradeClass student3 = new GradeClass(nameI, gradeArray[0],gradeArray[1],gradeArray[2],gradeArray[3]);
                }   }   
             
             else {
                 numPersons = 0;
             }
        }
        
    
    grade1A = student1.gradesF[0] + student2.gradesF[0] + student3.gradesF[0];
    
    averageA = student1.average + student2.average + student3.average;
    
    System.out.println("Name \t\t Grade 1 \t Grade 2 \t Grade 3 \t Grade 4 \t Average \n");
    System.out.println(student1.getName() + "\t" + student1.gradesF[0] +"\t" +student1.gradesF[1]+"\t" +student1.gradesF[2] +"\t" + student1.gradesF[3] + student1.average + "\n");
    System.out.println("Average\t\t" + grade1A + "\t" + grade2A + "\t"  + grade3A + "\t"  + grade4A + "\t" + averageA + "\n");
    

    
}}

В моем основном я пытаюсь вызвать другой экземпляр класса. Что ему нужно сделать, так это взять количество участников, их имена, сколько у них оценок, их оценки, ввести все оценки в массив, отправить имя вместе с оценками в gradeClass и позволить мне вызывать и использовать их оттуда .

    gradeClass student1 = new gradeClass(nameI, gradeArray[0],gradeArray[1],gradeArray[2],gradeArray[3]);

когда я пытаюсь использовать это, он сообщает мне, что мне нужна переменная

    gradeClass student1;
    student1 = new gradeClass(nameI, gradeArray[0],gradeArray[1],gradeArray[2],gradeArray[3]);

, а затем он говорит мне инициализировать student1, чтобы

    gradeClass student1 = null;

из здесь я получаю "java .lang.NullPointerException

любые идеи? Ошибка вызывается по адресу

    student1 = new gradeClass(nameI, gradeArray[0],gradeArray[1],gradeArray[2],gradeArray[3]);

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Прежде всего, имена классов должны начинаться с символа верхнего регистра. Следуйте соглашениям Java.

несмотря на то, что вы инициализировали переменную

int[] gradesF;

Вы определили переменную, но переменная имеет значение null, потому что вы не указали размер массива.

    gradesF[0] = grade1;
    gradesF[1] = grade2;
    gradesF[2] = grade3;
    gradesF[3] = grade4;

Вы не можете просто попытаться присвоить значения массиву, не определив предварительно размер массива.

Вы определяете массив с таким кодом, как:

int[] gradesF = new int[4];

Теперь вы можете назначить 4 значения в массиве, используя указанный выше код.

Изменить:

gradeClass student1;
student1 = new gradeClass(nameI, gradeArray[0],gradeArray[1],gradeArray[2],gradeArray[3]);

Прежде всего, нет необходимости сделайте это двумя операторами, поэтому большинство людей сделают это:

gradeClass student1 = new gradeClass(nameI, gradeArray[0], gradeArray[1], gradeArray[2], gradeArray[3]);

Но проблема в том, что в опубликованном вами коде вы никогда не создаете переменную "gradeArray" и не инициализируете ее значением. Вы не можете просто использовать переменную, не объявив ее предварительно.

0 голосов
/ 10 августа 2020

хорошо, я понял, что было не так, GradeClass student3 = new GradeClass (nameI, gradeArray [0], gradeArray [1], gradeArray [2], gradeArray [3]);

находился внутри if / else и не позволил бы мне вызывать его вне его. Мне пришлось отправить его классу внутри оператора if / else, а затем снова вызвать его внутри оператора if / else и назначить его новой переменной. Спасибо за помощь!

...