0

私は以下のコードを持っています:

ClassA.java

public class ClassA {
    static boolean isDone = false;
    public static void main(String[] args) {
        System.out.println("In class A.");
        if (!isDone) {
            new ClassB();
            isDone = true;
        }
    }
}

ClassB.java

public class ClassB {
    ClassB () {
        ClassA.main(null);
    }
}

プログラムを実行すると、次の出力が得られます。

In class A.
In class A.
Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.SingleByte.withResult(Unknown Source)
    at sun.nio.cs.SingleByte.access$000(Unknown Source)
    at sun.nio.cs.SingleByte$Encoder.encodeArrayLoop(Unknown Source)
    at sun.nio.cs.SingleByte$Encoder.encodeLoop(Unknown Source)
    at java.nio.charset.CharsetEncoder.encode(Unknown Source)
    at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)

「In class A」と印字しています。予想どおりですが、スタック オーバー フロー エラーが発生するのはなぜですか?

4

2 に答える 2

4

isDoneを呼び出した後にフラグを設定していますClassB()。そのため、無限の再帰呼び出しが発生しStackOverFlowError、メモリに到達したときにつながります。

isDoneを呼び出す前に、フラグ ( ) を設定しClassB();ます。

以下に示すように:

if (!isDone) {
    isDone = true;
    new ClassB();
}
于 2013-11-02T09:48:14.023 に答える
2

コードに無限のメソッド呼び出しチェーンがあり、StackOverflowError を引き起こしています。これはClassA、 のコンストラクターから のメイン メソッドを呼び出しているためですClassB。メイン メソッドの if ブロックは決して終了しません。コードの論理エラーは、インスタンスの作成前ではなく、インスタンスisDoneの作成後に flag( ) を設定することです。ClassB

ifからブロックを変更してみてください

 if (!isDone) {
         new ClassB();
         isDone = true;
  }

 if (!isDone) {
         isDone = true;
         new ClassB();
  }
于 2013-11-02T09:52:34.620 に答える