-1

私はJavaが初めてで、それがどのように機能するかを理解するためにいくつかの例を試しています.

次のコードが失敗する理由を理解するのに問題があります。エラーの原因となっている行はわかっていますが、その理由はわかりません。と の 2 つのクラスを作成Class1Mainました。そのコードは、2 つの別個の .java ファイルに記述されています。

public class Class1
{
    int var;
    public void method1 ()
    {
        System.out.println(var);
    }
    Class1 obj1 = new Class1(); // this is the line that causes the error
}

public class Main
{
    public static void main (String[] args)
    {
        Class1 obj = new Class1();
        obj.method1();
    }
}

正常にコンパイルされますが、実行java Mainすると何百回もエラーが出力されます

at Class1.<init>(Class1.java:8)

実行してみましたjava Main | more(Unix Bash を使用しています) が、パイプがなぜか無視され、エラー メッセージの最初の行が表示されません。またjava Main > log.txt、テキスト ファイルへの出力リダイレクトも機能しません。その行を削除すると、つまり、クラス本体でClass1オブジェクトを作成しない場合、すべて正常に動作します。誰かがその行の何が問題なのか説明できますか?obj1Class1

ありがとうございました

4

5 に答える 5

3

再帰的な初期化があると思いますObject

Class1 obj = new Class1();インスタンスステートメントであるため、メソッドから開始されたすべてのインスタンスで再帰的に呼び出されますmain

これにより、StackOverflowError.

これStackOverflowErrorは、スタックメモリがオーバーフローしていることを伝えるJVMの方法であり、それをトリガーする最も簡単な方法は、あなたの場合のように、メソッドまたはコンストラクターの無限再帰を使用することです。

于 2013-10-01T10:18:51.093 に答える
1

これは事実上無限ループであり、クラスの新しいインスタンスごとにクラスの新しいインスタンスを作成し、最終的に Java がメモリまたはスタックを使い果たし、例外をスローします。

于 2013-10-01T10:20:38.910 に答える
1

Class1 obj1 = new Class1();これは、同じクラスのクラス レベルで行うことは違法です

Class1 obj1;同じクラスのクラスレベルでオブジェクトを作成しないでください。同じクラスのクラスレベルのように参照を作成できます

于 2013-10-01T10:17:29.120 に答える
1

問題は、無限ループで Class1 オブジェクトを作成していることです。

main メソッドで Class1 オブジェクトを作成すると、Class1 本体で定義したすべての変数が初期化されます。ただし、Class1 本体内に新しい Class1 オブジェクトも作成するため、Class1 オブジェクトが作成され続け、ある時点でスタック オーバーフロー エラーが発生します。

于 2013-10-01T10:22:35.657 に答える