我开始在类(class)中学习面向对象,我们有一个名为students
的对象类。 students
类的对象存储实例变量:studentName
、studentNumber
和 studentGPA
。我的对象类中有一个 boolean 方法,用于确定学生是否是不及格的学生(如果他们的 GPA > 2.0,则学生不及格)然后我的 worker 类中有一个方法应该接受数组students
对象,然后如果学生不及格,它将用“null”替换该对象。
我的问题是我很难用 null 替换学生对象,因为 java 不断抛出我或类似的东西。这是我尝试过的:
public static void removeFailingStudents(Student[] students)
{
int count;
for (count=0; count<students.length; count++)
{
if(students[count].isFailing())
{
students[count] = null;
}
}
}
和
public static void removeFailingStudents(Student[] students)
{
int count;
for (count=0; count<students.length; count++)
{
if(students[count].isFailing())
{
students[count] = "null";
}
}
}
但是当我编译/运行这些尝试时,它要么抛出异常,要么对我大喊大叫,因为它不是 Student
类型。如何将对象数组中的项目设置为 null?感谢您的帮助!
这是我的完整代码:
public class L2Q1
{
public static void main(String[] parms)
{
process();
System.out.println("\nEnd of processing.");
}
public static void process()
{
Student[] students;
Student[] newStudents;
students = getStudents();
printStudents(students);
printAverageGPA(students);
printHonourStudents(students);
removeFailingStudents(students);
printStudents(students);
newStudents = compactStudents(students);
printStudents(students);
printStudents(newStudents);
}
public static void printStudents(Student[] students)
{
int count;
System.out.println("Students:");
for (count=0; count<students.length; count++)
{
System.out.println(students[count].toString());
}
System.out.println();
}
public static void printAverageGPA(Student[] students)
{
double sumGPA;
int count;
sumGPA = 0;
for (count=0; count<students.length; count++)
{
sumGPA += students[count].getGPA();
}
double average = sumGPA / count;
System.out.println("The average GPA is " + average);
System.out.println();
}
public static void printHonourStudents(Student[] students)
{
int count;
System.out.println("Honour students:");
for (count=0; count<students.length; count++)
{
if(students[count].isHonourStudent())
{
System.out.println(students[count].toString());
}
}
System.out.println();
}
public static void removeFailingStudents(Student[] students)
{
int count;
for (count=0; count<students.length; count++)
{
if(students[count].isFailing())
{
students[count] = null;
}
}
}
public static Student[] compactStudents(Student[] students)
{
Student[] newStudents;
int count1;
int count2;
System.out.println("Compacting failing students.");
System.out.println();
count1 = 0;
for (count2=0; count2<students.length; count2++)
{
}
newStudents = new Student[0];
return newStudents;
}
public static Student[] getStudents()
{
Student[] students = new Student[]
{
new Student(7654321, "Lara Zhivago", 3.75),
new Student(7654322, "Betty Brown", 1.9),
new Student(7654323, "Chris Cross", 0.5),
new Student(7654324, "Dr. Dre", 4.0),
new Student(7654325, "Joe Cool", 2.0)
};
return students;
}
}
/******************************************************************/
/******************************************************************/
class Student
{
private int number;
private String name;
private double gpa;
public Student(int snum, String sname, double sgpa)
{
this.number = snum;
this.name = sname;
this.gpa = sgpa;
}
public double getGPA()
{
return gpa;
}
public boolean isHonourStudent()
{
boolean isHonourStudent = false;
if(getGPA() >= 3.5)
{
isHonourStudent = true;
}
return isHonourStudent;
}
public boolean isFailing()
{
boolean isFailing = false;
if(getGPA() < 2.0)
{
isFailing = true;
}
return isFailing;
}
public String toString()
{
return number + " " + name + " " + gpa;
}
}
这是异常消息:
java.lang.NullPointerException
at L2Q1.printStudents(L2Q1.java:41)
at L2Q1.process(L2Q1.java:28)
at L2Q1.main(L2Q1.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
最佳答案
问题
您正在使 students
数组中的元素为空。然后您尝试在 null
元素上使用 toString()
。它看起来像这样:null.toString()
,显然这很糟糕。
没有ArrayList的解决方案
在评论中,人们建议 ArrayList .我假设这是家庭作业,您被迫使用数组,因此您应该这样做:
跟踪数组的大小。使用它来确定列表中有多少真实元素、非空元素。像这样:
for(int i = 0; i < arraySize; i++)
{
// Do something with the array here.
}
确保将 arraySize
声明为 instance variable .
private int arraySize = 0;
请记住,您需要为每个新元素递增 arraySize
,并在每次清空元素时递减它。
请记住,当您的程序完成时,您的数组末尾会有一串空值。
骇人听闻的解决方案
与此同时,您可以对 printStudents()
执行此操作——这是 hackish,只是一个临时修复。
public static void printStudents(Student[] students)
{
// Check if the array is null, good practice.
if(students == null)
return;
System.out.println("Students:");
for (int i = 0; i < students.length; i++)
{
// My hack: Check if element is null, if it is then skip it.
if(students[i] == null)
continue;
System.out.println(students[i].toString());
}
System.out.println();
}
关于java - 用空值替换对象数组中的项目(java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23876405/