コンパイラ エラーは、言語の規則が "items" の変数宣言の範囲を明確に示していないためです。
たとえば、次のようなコード ブロックがあるとします。
bool isTrue() {
bool returnValue = false;
if (cheese.isGreen()) {
returnValue = true;
}
return returnValue;
}
returnValue がメソッド全体で有効な変数であることは非常に明白です。
次のようなコード ブロックがあるとします。
bool isTrue() {
if (cheese.isGreen()) {
bool returnValue = true;
}
return returnValue;
}
returnValue が「if 句」の外では有効でないことは痛々しいほど明らかです。
しかし、次のようなコード ブロックがあるとします。
bool isTrue() {
if (cheese.isGreen())
bool returnValue = true;
return returnValue;
}
returnValue が if ステートメントのスコープ内にあるか、または returnValue がメソッド全体のスコープ内にあるかは明確ではありません。これは、Java 言語文法のレイアウトの詳細によるものです。基本的に、任意のブロック内で新しい変数を宣言できますが (ブロックは変数のスコープを明確に定義するため)、この if ステートメントにはブロックが含まれていません。
Java が自動的にブロックを追加すると仮定すると、スコープは「忘れられたブロック」内にあります。スコープを含む明示的なブロックがないため、変数のスコープはメソッドの残りの部分と同じレベルにあると仮定します。どちらの視点が「より」正しいかについての議論はたくさんあるので、そのようなことをしようとする試みはすべて禁じられています.
これが奇妙に思え、変数が暗黙のブロックのスコープ内で定義されていると仮定しないのは狂人だけだと思う場合は、スコープが同じレベルにある Java より前の言語があったことを思い出してください。 returnステートメントとして。はい、今日の基準ではクレイジーな言語ですが、それらはまだ存在していました。