java - 用空值替换对象数组中的项目(java)

标签 java arrays object null

我开始在类(class)中学习面向对象,我们有一个名为students 的对象类。 students 类的对象存储实例变量:studentNamestudentNumberstudentGPA。我的对象类中有一个 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/

相关文章:

javascript - 通过输入字段创建循环的js对象

javascript - 发布大数据形式 Angular JS

java - 尝试创建数组列表给了我这个错误

java - 处理现实世界中银行交易的并发请求

java - 两个 ArrayList/List 对象的排序

javascript - 从 jQuery 中的复选框的数组值中删除

javascript - 如何更新 Javascript 对象列表中某个键的值?

java - SplitPane 垂直不起作用

java - 如何从 Java 的标准输入读取 python 二进制字符串

c - 将数组分配给具有复杂情况的指针