Java 使用和操作不带Array.replace Array.copy的数组

Java 使用和操作不带Array.replace Array.copy的数组,java,arrays,nullpointerexception,Java,Arrays,Nullpointerexception,好吧,我用一小部分代码发布了一个问题。我意识到,如果人们能够看到整个代码,那么回答问题就更容易了。当我运行程序时,我会得到nullpointerException。我不允许对数组使用.replace.copy.remove。我不知道为什么,但那正是我老师想要的 班级成绩: public class Grades { // Fields private float[] listOfGrades; private int numOfScores; //

好吧,我用一小部分代码发布了一个问题。我意识到,如果人们能够看到整个代码,那么回答问题就更容易了。当我运行程序时,我会得到nullpointerException。我不允许对数组使用.replace.copy.remove。我不知道为什么,但那正是我老师想要的

班级成绩:

public class Grades {

    // Fields

    private float[] listOfGrades;
    private int numOfScores;

    //
    // Constructor
    public Grades() {
        float[] listOfGrades = new float[0];
    }

    public Grades(float[] g) {

        for (int i = 0; i < g.length; i++) {
            if (g[i] >= 0 && g[i] <= 100) {
                listOfGrades[i] = g[i];

            }
        }

    }

    //
    // AccessorMethods
    public int getNumberOfScores() {
        try {
            int numOfScores = 0;
            for (int i = 0; i < listOfGrades.length; i++) {
                numOfScores++;

            }
        } catch (Exception e) {

        }

        return numOfScores;
    }

    public float[] getCopyOfListOfGrades() {
        float[] listOfGradesCopy = new float[listOfGrades.length];

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

            listOfGrades[i] = listOfGradesCopy[i];
        }
        return listOfGradesCopy = listOfGrades;

    }

    public float getFirstGrade() {

        return listOfGrades[0];

    }

    public float findMax() {

        float largest = listOfGrades[0];

        for (int i = 0; i < listOfGrades.length; i++) {
            if (listOfGrades[i] > largest) {
                largest = listOfGrades[i];
            }
        }
        return largest;
    }

    public float findMin() {

        float largest = listOfGrades[0];

        for (int i = 0; i < listOfGrades.length; i++) {
            if (listOfGrades[i] < largest && listOfGrades[i] != 0) {
                largest = listOfGrades[i];
            }
        }
        return largest;
    }

    public float calculateAverage() {
        float avg = 0;
        for (int i = 0; i < listOfGrades.length; i++) {
            if (listOfGrades[i] != 0) {
                avg += listOfGrades[i];
            }
        }
        return avg / 100;

    }

    public void addGrade(float g) {
        if (g >= 0 && g <= 100) {
            float[] newListOfGrades = new float[listOfGrades.length + 1];

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

                newListOfGrades[i] = listOfGrades[i];
                if (listOfGrades.length == i) {

                    listOfGrades[i] = g;
                }
            }

        } else {
            System.out.println("Sorry number not in range");
        }
    }

    public Grades deleteGrade(float g) {

        float[] result = new float[listOfGrades.length - 1];
        int index = 0;
        for (int i = 0; i < listOfGrades.length; i++) {
            if (listOfGrades[i] == g) {

                result[index] = listOfGrades[i];
                index++;
            }
        }
        Grades newGrade = new Grades(result);

        return newGrade;

    }

}

带参数的构造函数没有考虑内部数组是以零长度初始化的

您必须在顶部添加这一行:

listofGrades = new float[g.length];
如果没有这一点,将g的内容分配到listofGrades将无法使用NPE

public Grades(float [] g){
        listOfGrades = new float[g.length];
        for(int i = 0; i < g.length; i++){
            if(g[i] >=0 && g[i] <=100){
                 listOfGrades[i] = g[i];

        }
    }   

}
如果在使用默认构造函数构造对象后立即调用此函数,它也将抛出NullPointerException

您的代码中有更多奇怪之处,例如:

public int getNumberOfScores(){
    try{
  int numOfScores = 0;
    for(int i = 0; i < listOfGrades.length;i++){
        numOfScores++;

    }
    }catch(Exception e){


    }

    return numOfScores;
}

这将适用于长度为零的数组,因为在本例中,长度为零。

为什么要创建一个包含零元素的浮点数数组?float[]listOfGrades=新浮点[0]@Fadi Hanna AL-Kass我的老师想让我们放在一个空数组中。空数组和没有位置来保存值的数组(即大小为0的数组)之间有区别。加上Fadi所说的,数组是用定义的长度初始化的,所以新的float[0];创建一个具有零元素的浮点数组,其中新的浮点[2];将创建一个包含2个空元素的空浮点数组。但零长度数组是完全有效的代码。例如,它们的一个优点是,可以像任何旧数组一样对它们进行迭代。存在许多零长度数组的用例。
public float getFirstGrade(){

    return listOfGrades[0];

}
public int getNumberOfScores(){
    try{
  int numOfScores = 0;
    for(int i = 0; i < listOfGrades.length;i++){
        numOfScores++;

    }
    }catch(Exception e){


    }

    return numOfScores;
}
public int getNumberOfScores(){
    return listOfGrades.length;
}