Java 中的空指针异常,尽管已初始化变量

Null pointer exception in Java despite having initialized the varibale

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");
    

    
}}

在我的主要即时消息中,我试图调用 class 的另一个实例。它需要做的是获取参与者的数量、姓名、他们有多少成绩、他们的成绩,将所有成绩输入一个数组,将姓名和成绩一起发送到 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]);

首先 class 名称应以大写字符开头。遵循 Java 惯例。

despite having initialized the varibale

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”变量并使用值对其进行初始化。您不能不先声明变量就直接使用它。

好的,我知道出了什么问题, GradeClass student3 = new GradeClass(nameI, gradeArray[0],gradeArray[1],gradeArray[2],gradeArray[3]);

在 if/else 语句中,不允许我在它之外调用它。我必须将它发送到 if/else 语句内的 class,然后在 if/else 语句内再次调用它并将其分配给一个新变量。感谢您的帮助!