5

次の Java コードは、コンパイラ エラーをスローしています。

if ( checkGameTitle(currGame) )
    ArrayList<String> items = parseColumns( tRows.get(rowOffset+1), currGame, time, method );

checkGameTitleブール値を返す public static 関数です。エラーはすべて「シンボルが見つかりません」というタイプで、シンボルは variable ArrayListvariable Stringおよびvariable itemsです。

ただし、{中かっ​​こ} を追加すると、コードはエラーなしでコンパイルされます。これはなぜでしょうか?ifそれらのない句にあいまいさがありますか?

4

6 に答える 6

11

itemsこの時点で変数を宣言すると、どこからでもアクセスできなくなります。したがって、この構文を許可しても意味がありません。

OTOH、ブロックを開くとき、同じことをしても意味がありません(最初は)。しかし、後でブロックを拡張する必要があり、最終的には意味を成すことが予想されます。

于 2010-03-27T03:21:26.770 に答える
4

中括弧を使用して、宣言を含めることができるブロックを作成します。中括弧がないと、例のような宣言ではなく、ステートメントのみを使用できます

于 2010-03-27T03:25:27.683 に答える
2

これらの状況で常に役立つと思うという理由だけで、Java 言語仕様の関連部分は§14.4です。

すべてのローカル変数宣言ステートメントは、すぐにブロックに含まれます。ローカル変数宣言ステートメントは、ブロック内の他の種類のステートメントと自由に混在させることができます。

つまり、ローカル変数の宣言は、ブロックの「すぐ下」のレベルでスタンドアロンの宣言としてのみ表示される場合があります ( {})。それらはStatements(§14.5) としてカウントされません。これは の後に続くものですif (....)

于 2010-03-27T10:52:12.983 に答える
1

問題はこれです:

if ( condition )
    ArrayList<String> items = ...;

...基本的にこれと同等です:

if ( condition ) {
    ArrayList<String> items = ...;
}

定義して初期化しましitemsたが、ステートメント/ブロックを終了すると、すぐにスコープから外れるため、実際には何にも使用できません。コンパイラはそれについて警告しています。

于 2010-03-27T03:47:43.067 に答える
0

コンパイラ エラーは、言語の規則が "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ステートメントとして。はい、今日の基準ではクレイジーな言語ですが、それらはまだ存在していました。

于 2010-03-27T05:26:04.037 に答える
0

if ステートメントで変数itemsを定義しているため、そのスコープ外のどこからでも使用できません。

編集:遅すぎる...

于 2010-03-27T03:24:55.540 に答える