【问题标题】:Java - how to call an add() method in a different classJava - 如何在不同的类中调用 add() 方法
【发布时间】:2016-02-05 21:02:24
【问题描述】:

这是做作业的,我对自己无法弄清楚这么简单的事情感到有点沮丧。

为了简化我的代码,我现在有 3 个文件:一个具有我创建的 add() 方法的类,一个测试它的文件(由教授创建),以及一个创建对象的文件(我不会发布,b / c它的工作)。这是 add() 函数。

编辑 2:我要添加打印数组的方法,也许这就是问题所在?

    public class Population {
      private Person[] pop = new Person[15];
      private int numPop = 0;    

      public void add(Person c){ // this object is created in another class, it works fine
        for(int i = 0; i < pop.length; i++){
          if(pop[i] == null) {
            pop[i] = c;
            numPop++;
          } else {}
        }

 public String listPeople(){
      System.out.println("Population with "+numPeople+" people as follows:");
      int i = 0;
      while (i<numPeople){
       System.out.println("A "+pop[i].getAge()+"year old person named "+pop[i].getName());
        i++;
//FYI the get methods are working fine and are in another file.
 } 
      return("");
      }

然后,我在提供给我们的测试文件中运行程序以确保其正常工作。这是不工作的部分

public class PopTestProgram{ // FYI the prof created this, I can't change this
  public static void main(String[] args){

    Population pop = new Population(15);

    pop.add(new Person(4, "Bob"));
    pop.add(new Person(25, "Kim"));
    // then adds 8 more people with different ages and names
    // then prints the people

它可以编译,但是当我运行它时,它只是将最后一个人的 10 个放入数组中,然后崩溃说 "pop[i] = c;" 行有问题。我根本不知道我需要在这里更改什么。

我没有直接收到教授的电子邮件,所以我想我会在这里问。

编辑:这是打印出最后一个人 10 次后显示的内容。它显示了我尚未完成的其他方法的问题......

java.lang.ArrayIndexOutOfBoundsException: -1
    at Population.removePerson(Population.java:49)
    at PopTestProgram.main(PopTestProgram.java:31)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

【问题讨论】:

  • 你得到的确切异常是什么?
  • 是的,展示整个该死的东西!
  • 从 'new Person(4, "Bob"));' 传递的内容看起来像一个错误线。你能展示一下方法吗,或者至少展示一下错误发生时'c'的值是什么?
  • 如果你真的想要它,我会发布异常,但我玩弄了我的代码,现在它没有显示我想看到的异常......它显示了不同的异常我还没有完全完成的方法。
  • 这不是答案,而是for 循环,您应该使用while 循环在pop 中查找null 值的索引并使用该值在该循环之外。这样,一旦找到该索引,就不必遍历数组的其余部分。

标签: java class object add indexoutofboundsexception


【解决方案1】:

在 add(Person) 中,添加项目时不会停止,因此您添加的第一个项目会放入数组中的所有单元格中,然后其余的根本不会进入,因为没有更多的数组中的空单元格。当你找到一个空的位置时打破循环。

public void add(Person c) {
    for(int i = 0; i < pop.length; i++){
      if(pop[i] == null) {
        pop[i] = c;
        numPop++;
        break;
      }
      else {
        //.....
      }
   }
}

也可以只使用 numPop 作为列表中的下一个位置,例如:

public void add(Person c) {
    if (numPop < pop.length) {
       pop[numPop++] = c;
    }
}

【讨论】:

  • 这没用 :( 它打印的是完全相同的东西。我将添加打印数组的方法,也许问题出在那儿。
  • 问题出在removePerson。请包括该方法。
【解决方案2】:

Population.removePerson(Population.java:49) 出现异常,与 add 方法无关。所以我假设 removePerson 是打印这个人的方法。 在删除时,您正在调用一个额外的 For 循环,请确保您的迭代仅为 10 次。

java.lang.ArrayIndexOutOfBoundsException: -1 清楚地告诉 removePerson 方法也在调用 index -1(不存在导致 ArrayIndexOufofBoundsException)。 removePerson 方法应该从索引 9 开始到索引 0(反之亦然)[总共 10 次迭代],然后停止。

希望对你有帮助

【讨论】:

  • 不幸的是,这不是错误所在。那个方法还不完整,你是对的,但我试图修复的错误发生在 removePerson() 甚至运行之前。这就是为什么我提到例外不会有帮助:)
  • 异常跟踪是这样说的:在 Population.removePerson(Population.java:49)。 Population.java 中第 49 行的代码是什么
  • 是的,我知道那里有错误。但它在 add() 和 listPeople() 之后运行,因此与当前问题完全无关。我可以取出 removePerson() 并且我会遇到同样的问题。我就是这个意思。
猜你喜欢
  • 2014-03-23
  • 2015-03-29
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多