3

宣言されているだけで初期化されていないJavaオブジェクトがデフォルトでnull値に設定されることは理解していますが、なぜ次のコードはコンパイルしてnullを出力しないのでしょうか?

String a;
System.out.println(a);
4

4 に答える 4

5

JLSのセクション16から:

各ローカル変数 (§14.4) とすべての空白の最終フィールド (§4.12.4、§8.3.1.2) には、その値へのアクセスが発生したときに、明確に割り当てられた値が必要です。

コードは、セクション 4.12.5に従って初期化されるため、非 final フィールド (インスタンスまたは静的変数) に対しては機能しますが、これにより、ローカル変数に対してコンパイル時エラーが発生します。

aプリミティブ変数の場合も同様です。以下は、これらすべてを示す短いが完全なプログラムです。

class Test {

    static int x;
    static String y;

    public static void main(String[] args) {
        System.out.println(x);
        System.out.println(y);

        int lx;
        String ly;
        System.out.println(lx); // Compile-time error
        System.out.println(ly); // Compile-time error
    }
}

非コンパイル行が削除された後の最初の 2 行の出力:

0
null
于 2013-09-28T15:55:36.917 に答える
4

クラスのフィールドはデフォルトで初期化されます。

お気に入り

class A {
  String a;

  public void doSomething() {
     System.out.println(a); //prints null
  }
}

ただし、ローカル変数は明示的に初期化する必要があります。したがって、a明示的に初期化する必要があるため、上記のコードは機能しません。

Java 言語仕様のセクション4.12.5を読むことをお勧めします。Initial Values of Variablesでは、この動作が詳細に説明されています。

于 2013-09-28T15:54:22.407 に答える
2

オブジェクト参照であるインスタンス変数は、常に null に初期化されます。しかし、ローカル変数の場合はそうではありません。

ローカル変数を明示的に初期化する必要があります。

例えば

String a = null;
System.out.println(a);
于 2013-09-28T15:53:23.343 に答える
0

Java のフィールドは、アクセスする前に初期化する必要があります。参照型のクラス プロパティ (フィールド) (たとえば) は、オブジェクトの構築 (つまり、コンストラクター コードの実行) の前に null で初期化されることが保証されているため、明示的に初期化することはできません。これは、初期化されていないフィールドにアクセスしないという保証です。ローカル メソッド フィールドにはそのようなロジックがないため、明示的に行う必要があります。

于 2013-09-28T15:58:40.680 に答える