15

これは奇妙なものです。コード自体はかなり役に立たないことはわかっていますが、なぜエラーが発生するのか疑問に思っています:

私はいくつかのコードを書いていました、私はこれを書きました:

if(scan.hasNextInt())
    int row = scan.nextInt();

row当時は変数のスコープについて考えていませんでしたが、とにかくそれを超えて使用できないため、明らかにこれは役に立ちませifん。私が得られないのは、私がしたエラーが発生した理由です:

> javac hw.java
hw.java:25: '.class' expected
    int row = scan.nextInt();
        ^
hw.java:25: not a statement
    int row = scan.nextInt();
    ^    
hw.java:25: illegal start of expression
    int row = scan.nextInt();
            ^
hw.java:25: ';' expected
    int row = scan.nextInt();
                  ^

ここで、それを変更する場合は、次のようにチェックします。

if(scan.hasNextInt()) {
    int row = scan.nextInt();
}

それはうまくコンパイルされます。中かっこの下に 1 行ある場合、ifオプションであるという印象を受けました...明らかに、他の考慮事項もあります。そうしないと、両方ともコンパイルまたは失敗します。

誰かが私に説明したりif、中括弧なしで条件の下でローカル変数を宣言できない理由を説明するドキュメントを教えてもらえますか?


編集:これが完全な機能です:

public static char getinput() {
    System.out.println("Where do you want to go? (row column)");
    Scanner scan = new Scanner(System.in);
    if(scan.hasNextInt())
        int row = scan.nextInt();
    String input = scan.next();
    System.out.println(input);
    return 'a';    
}
4

2 に答える 2

26

if, for,がある場合は、whileその後do/whileにステートメントを続ける必要があります。宣言は声明ではありません。

JLS 14.9から- if ステートメント

IfThenStatement:
    if ( Expression ) Statement

IfThenElseStatement:
    if ( Expression ) StatementNoShortIf else Statement

IfThenElseStatementNoShortIf:
    if ( Expression ) StatementNoShortIf else StatementNoShortIf

宣言した変数はすぐにスコープ外になるため使用できないため、これを行うと思います(同じ宣言を除く)

于 2012-12-19T16:02:13.707 に答える
1

私の推測では、宣言は実行可能なステートメントではなく、代入を含む宣言は実際にはコンパイラによって 2 つの異なるステートメントに分割され、最初のステートメント (宣言) は実行可能ではありません。if には、ブロックまたは実行可能なステートメントのいずれかの実行可能な構造が必要です。

Eclipse デバッガーで非割り当て宣言ステートメントにブレークポイントを設定できなかったことはわかっています。おそらく同じ根本的な理由です。

于 2012-12-19T15:59:33.370 に答える