Java 使用和操作不带Array.replace Array.copy的数组
好吧,我用一小部分代码发布了一个问题。我意识到,如果人们能够看到整个代码,那么回答问题就更容易了。当我运行程序时,我会得到nullpointerException。我不允许对数组使用.replace.copy.remove。我不知道为什么,但那正是我老师想要的 班级成绩: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; //
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;
}