宣言されているだけで初期化されていないJavaオブジェクトがデフォルトでnull
値に設定されることは理解していますが、なぜ次のコードはコンパイルしてnullを出力しないのでしょうか?
String a;
System.out.println(a);
宣言されているだけで初期化されていないJavaオブジェクトがデフォルトでnull
値に設定されることは理解していますが、なぜ次のコードはコンパイルしてnullを出力しないのでしょうか?
String a;
System.out.println(a);
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
クラスのフィールドはデフォルトで初期化されます。
お気に入り
class A {
String a;
public void doSomething() {
System.out.println(a); //prints null
}
}
ただし、ローカル変数は明示的に初期化する必要があります。したがって、a
明示的に初期化する必要があるため、上記のコードは機能しません。
Java 言語仕様のセクション4.12.5を読むことをお勧めします。Initial Values of Variablesでは、この動作が詳細に説明されています。
オブジェクト参照であるインスタンス変数は、常に null に初期化されます。しかし、ローカル変数の場合はそうではありません。
ローカル変数を明示的に初期化する必要があります。
例えば
String a = null;
System.out.println(a);
Java のフィールドは、アクセスする前に初期化する必要があります。参照型のクラス プロパティ (フィールド) (たとえば) は、オブジェクトの構築 (つまり、コンストラクター コードの実行) の前に null で初期化されることが保証されているため、明示的に初期化することはできません。これは、初期化されていないフィールドにアクセスしないという保証です。ローカル メソッド フィールドにはそのようなロジックがないため、明示的に行う必要があります。