2012-11-30 5 views
6

制御構造の条件に従った宣言がブロック内にある必要があるのはなぜですか?

public class Test { 
    public void method(String foo) { 
     // This compiles if the curly braces are uncommented 
     if(foo instanceof Object) // { 
      Object bar = (Object) foo; 
     // } 
    } 
} 

をコンパイルしようとすると、私は

javac -Xlint:all Test.java 
Test.java:5: error: not a statement 
      Object bar = foo; 
      ^
Test.java:5: error: ';' expected 
      Object bar = foo; 
       ^
2 errors 

なぜObject bar = (Object) foo;がコンパイルするコードのブロックにする必要がありますか、次のエラーが出ますか

答えて

7

なぜオブジェクトバー=(オブジェクト)FOOを行います。コードをコンパイルするにはブロック内にある必要がありますか?

それはに無意味なので

それはブロック内の唯一のステートメントの変数宣言します。宣言は無意味です。後​​続のコードで変数を参照することはできません。変数のスコープは となり、宣言はとなります。

基本的に、コンパイラは無意味なことをやめようとしています。

IfThenStatement: 
    if (Expression) Statement  

今声明生産はsection 14.5によって定義されます。仕様の面では

、これはあなたが(section 14.9 of the JLS)を使用しようとしている生産があります。

ここにはLocalVariableDeclarationStatementはありません。そののみがBlockStatementプロダクションで発生し、JLSのsection 14.4で定義されています。

+0

私たちはもっと精密にすることはできません;) – Mik378

1

ローカルスコープ変数を宣言して、親スコープで直接使用することはできません。

中括弧を配置しないと、条件の解釈文が1つだけ表示されます。

したがって、このステートメントが代入の場合、親スコープ(中括弧の外側)のみがそれを操作するユニークな方法であるため、後でこの割り当てを使用することはできません。

したがって、コンパイラはこの状況について不平を言う。次のようにそれを避けるために中括弧を入れずに

、あなたがしなければならない。

public void method(String foo) { 
     Object bar; 
     if(foo instanceof Object) //redundant here by the way... 
      bar = (Object) foo; 
      //... 
} 
関連する問題