6
public class Test{
   public void newMethod(){

      if(true)int i=0;

   }
}

上記のコードは私に次のエラーを与えます

Test.java:4: error: '.class' expected
      if(true)int i=0;
                  ^

でもこう書くと

public class Test{
   public void newMethod(){

      if(true){
         int i=0;
      }

   }
}

それならエラーなし!

この質問がコミュニティの役に立たないことは承知していますが、なぜこのステートメントに括弧を付ける必要があるのか​​、非常に興味があります。私は数年間Javaでプログラミングを行ってきましたが、このエラーに遭遇したのは今だけです。

ちなみにJGraspを使っています。

4

2 に答える 2

7

これが私の理解です。JAVA SE 7仕様の第14章からの引用:

14.2. ブロック

ブロックは、一連のステートメント、ローカル クラス宣言、および中かっこ内のローカル変数宣言ステートメントです。

Block:
    { BlockStatementsopt }

........     

BlockStatement:
    LocalVariableDeclarationStatement
    ClassDeclaration
    Statement

したがって、ブロックは常に中かっこで囲まれます{ ... }

14.4. ローカル変数宣言ステートメント

ローカル変数宣言ステートメントは、1 つ以上のローカル変数名を宣言します。

LocalVariableDeclarationStatement:
    LocalVariableDeclaration ;

LocalVariableDeclaration:
    VariableModifiersopt Type VariableDeclarators

.......

VariableDeclarator:
    VariableDeclaratorId
    VariableDeclaratorId = VariableInitializer

.......

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

では、「すぐに封じ込める」とはどういう意味ですか?

一部のステートメントには、構造の一部として他のステートメントが含まれています。そのような他のステートメントは、ステートメントのサブステートメントです。S が T を含み、T が U を含む、S および U と異なるステートメント T がない場合、ステートメント S はステートメント U をすぐに含むと言います。同様に、いくつかのステートメントは、その構造の一部として式 (§15) を含みます。

あなたの例を見てみましょう:

public class Test{
   public void newMethod(){

      if(true)int i=0;

   }
}

この場合、次のブロックがあります。

{

          if(true)int i=0;

}

このブロック内には、次のものがありIf Statementます。

if(true)int i=0;

このステートメントには、ローカル変数の宣言が含まれています。

int i=0;

したがって、条件に違反しています。思い出してください:すべてのローカル変数宣言ステートメントは、すぐにブロックに含まれます。ただし、この場合、ローカル変数の宣言は、ブロック自体ではなく、別のブロックに含まれる If ステートメントに含まれています。したがって、このコードはコンパイルされません。

唯一の例外はforループです。

A local variable declaration can also appear in the header of a for statement (§14.14). In this case it is executed in the same manner as if it were part of a local variable declaration statement.

(理解するために何度か読み直す必要があるかもしれません。)

于 2013-10-09T18:50:04.410 に答える