言語仕様では、次のように述べています。
ローカル変数は使用前に確実に設定されます。他のすべての変数はデフォルト値に自動的に初期化されますが、Java プログラミング言語は、プログラミング エラーのマスキングを避けるためにローカル変数を自動的に初期化しません。
Javaでプログラミングエラーを正確にマスキングしているのは何ですか?
これを説明する例はいいでしょう。
ありがとう
言語仕様では、次のように述べています。
ローカル変数は使用前に確実に設定されます。他のすべての変数はデフォルト値に自動的に初期化されますが、Java プログラミング言語は、プログラミング エラーのマスキングを避けるためにローカル変数を自動的に初期化しません。
Javaでプログラミングエラーを正確にマスキングしているのは何ですか?
これを説明する例はいいでしょう。
ありがとう
これを理解するには、C/C++ の機能と比較する必要があります。C/C++ では、ローカル変数は宣言時にガベージ値を含みます。したがって、値を割り当てるのを忘れた場合、コンパイラは文句を言わず、そのようなローカル変数へのすべての参照はガベージ値で動作し、予期しない動作が発生します。
Java では、このような初期化されていないローカル変数はコンパイル時エラーを引き起こし、開発者はそれを使用する前に意味のあるデフォルト値に明示的に初期化します。
C/C++
int do_something(int value) {
int i;
if (value > 10) {
i = value;
}
return i;
}
上記のスニペットは C++ では有効ですが、Java では無効です。
int doSomething(int value) {
int i;
if (value > 10) {
i = value;
}
//
// This line will throw a compile-time error that
// `i` may not have been initialized.
//
return i;
}
「プログラミング エラーのマスキング」は、特定の種類のエラーではありません。これは、プログラミングのエラーを「マスク」(非表示、難読化、検出を困難にする) したくないことを意味します。たとえば、次のコードには不適切なエラーがあります。私は String 変数を何にも設定しませんでした。
String theString;
System.out.println(theString);
このコードはコンパイルされますが、実行されません。null 参照例外などが発生します。その理由は、変数theString
に値が設定されていないためです。一方、Java が変数theString
に値 (空の文字列 "" など) を設定すると、プログラムは実行されますが、何も出力されません。Java はデフォルト値を設定してエラーを「マスク」するため、これを理解するのに長い時間がかかる場合があります。
ローカル変数は多くの問題の原因となる可能性があるため、コンパイラはここで助けようとしています。これらの問題を明らかにするために Java ができること (それらを隠すことの反対) は役に立ちます。