0

我正在尝试在 Java 中创建一个类,该类构建一个类型的对象,该对象Action包含三个整数并将其返回给我在数组中的另一个类history,其中history是类型数组Action。当它被调用时,我立即得到一个无限循环;因此堆栈溢出。

错误 - 我打印了 1 行,它继续...

Exception in thread "main" java.lang.StackOverflowError
    at sudokugame.Action.<init>(Action.java:7)

班级:

public class Action {

    Action a;
    public Action(int i, int o, int p){
      a = new Action(i,o,p);
    }

    public void   setAction(int n, int b, int c){

    }

    public Action  getAction(){
        return a;
    }
}
4

8 回答 8

12

你的构造函数永远递归地调用自己。溢出堆栈的可靠方法:)

public Action(int i, int o, int p){
    //why do you do this?
    a = new Action(i,o,p);
}

也许您真正想做的只是将 i、o 和 p 存储在类实例中?

public class Action {

  int i;
  int o;
  int p;

  public Action(int i, int o, int p){
    this.i = i;
    this.o = o;
    this.p = p;
  }

  ...
}

(编辑:查看其他答案以获得更完整的示例)

于 2009-06-30T13:12:35.843 回答
3

尝试这样做:

public class Action {

  int i;
  int o;
  int p;

  public Action(int i, int o, int p){
    this.i = i;
    this.o = o;
    this.p = p;
  }

  public void setAction(int n, int b, int c){
    this.i = i;
    this.o = o;
    this.p = p;
  }

  public Action getAction(){
    return this;
  }
}
于 2009-06-30T13:15:20.610 回答
2

问题在这里:

a = new Action(i,o,p);

您正在为类本身的构造函数中的新实例再次调用构造函数。由于对构造函数的每个后续调用都会创建一个新的构造函数调用,因此堆栈无法展开,因此会产生堆栈溢出。

于 2009-06-30T13:14:35.637 回答
0

您在其内部实例化类。

于 2009-06-30T13:12:43.660 回答
0

您的 Action 类真的需要保留对另一个 Action 的引用吗?

Action a;

具体来说,这条线有必要吗?你用它做什么?

于 2009-06-30T13:15:14.807 回答
0

构造函数有递归调用。

于 2009-07-01T06:13:08.383 回答
0

确保您的构造函数具有递归调用。

于 2009-06-30T13:25:16.660 回答
0

命令设计模式是一种处理这样一种情况的方法,即您希望拥有所采取的操作的历史记录,以便可以撤消这些操作等。

于 2009-06-30T15:20:33.433 回答