0

私は最近Javaでコードをいじりましたが、コンパイラがNullPointerExceptionをスローするため、コンストラクタ内のコードが実行されていないように見えるというこの問題に遭遇しました。

public class ObjectA {

protected static ObjectA oa;
private String message = "The message";

public ObjectA() {

    oa = new ObjectA();

}

public static void main(String args[]) {

    System.out.println(oa.message);

}  }

オブジェクトの作成をコンストラクターの前に移動すると、つまり 1 行で作成すると、すべて正常に動作します。

なぜこれが起こるのか、コードの理解がどこで間違っているのか、誰かが私に説明できますか?

前もって感謝します。

4

5 に答える 5

7

ObjectA()コンストラクターを除いて、コンストラクターを呼び出すことはありませんObjectA。コンストラクタを (たとえば from から) 呼び出したことmainあると、永久に再帰するため、スタック オーバーフローが発生します。

何をしようとしているのか、なぜ静的変数を使用しているのかは明確ではありませんが、コードは次のように単純になります。

public class ObjectA {
    private String message = "The message";

    public static void main(String[] args) {
        ObjectA oa = new ObjectA();
        System.out.println(oa.message);
    }
}

また、コンパイラは例外をスローしないことに注意してください。コンパイル時エラー (構文エラーなど) と実行時エラー (通常は例外) を区別することは非常に重要です。

于 2013-03-12T15:16:25.023 に答える
0

1)オブジェクトを作成することはありません

置く:

ObjectA oa = new ObjectA();

System.out.printの前のメインにあります。

2)メッセージをプライベートではなくパブリックに設定します。

于 2013-03-12T15:20:27.500 に答える
0

あなたがこのように必要なものを願っています

public class ObjectA {

    protected static ObjectA oa;
    private String message = "The message";

    public ObjectA() {
    }

    public static ObjectA getInstance() {
        if (oa == null) {
            oa = new ObjectA();
        }
        return oa;
    }

    public String getMessage() {
        return message;
    }

    public static void main(String args[]) {
        System.out.println(ObjectA.getInstance().getMessage());
    }
}
于 2013-03-12T15:21:33.033 に答える
0

ObjectA oa = new ObjectA()メインメソッドに移動する必要があります。

また、これは必要ありません。protected static ObjectA oa;

チュートリアルから Hello World プログラムをコピーして貼り付け、その動作を確認してください。

于 2013-03-12T15:16:41.653 に答える
0

静的変数を定義しますoaが、クラスのコンストラクターでのみ初期化します。クラスをインスタンス化することはないObjectAためoa、null になることしかできません。

メイン メソッドを呼び出すと、null オブジェクトの変数にアクセスしようとするmessageため、NPE になります。

于 2013-03-12T15:17:57.330 に答える