0

ActionJava で、 3 つの int を保持するtype のオブジェクトを構築し、それを array 内の他のクラスに返すクラスを作成しようとしています。historyここhistoryで、 は type の配列です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-07-01T06:13:08.383 に答える
0

コマンド デザイン パターンは、実行したアクションの履歴を取得して元に戻すことができるようにする場合にアプローチする 1 つの方法です。

于 2009-06-30T15:20:33.433 に答える
0

あなたの Action クラスは本当に別の Action への参照を保持する必要がありますか?

Action a;

具体的には、この行は必要ですか?何に使うの?

于 2009-06-30T13:15:14.807 に答える
0

コンストラクターに再帰呼び出しがあることを確認してください。

于 2009-06-30T13:25:16.660 に答える
0

それ自体の中でクラスをインスタンス化します。

于 2009-06-30T13:12:43.660 に答える