2017-11-25 33 views
1

私は2つのコードを作成しました。最初の関数は正常に動作しますが、もう一方は変数宣言がここでは許可されていないと言います。Java変数の宣言が許可されていません

まずコード(ワーキング)(動作しない)

class Test { 
    public static void main(String args[]){ 
     for(int i=0;i<10;i++) { 
      int a[]=new int[10]; 
     } 
    } 
} 

セカンドコード

class Test { 
    public static void main(String args[]) { 
     for(int i=0;i<10;i++) 
      int a[]=new int[10]; 
    } 
} 

その背後にある理由は何ですか。私はコードの両方のセクションがほぼ同じだと思います。

答えて

4

2番目のコードがコンパイルされないのは、ループの本体として宣言された変数aが未使用のままであることをJavaコンパイラが認識しているためです。宣言の周りに中括弧がないので、新しく宣言された変数を使用するコードを追加する方法はまったくないため、Javaコンパイラはそれをエラーとしてフラグを立てます。

最初のプログラムの場合、Javaコンパイラはその変数が未使用であることを検出できますが、エラーであるとは確信できません。まだ完成していないコードブロックを開始した可能性があるので、コンパイラはコードをコンパイルして実行できるようにします。

+0

okこれは、中括弧なしで宣言された変数は、未使用のまま残されていることを意味し、エラーの原因となっています。 –

6

私は両方のコードがほぼ同じだと思います。

ほぼそうではありません。コンパイラが不平を言っている理由を理解するには、しばしばlanguage specificationを見てください。

ForStatementの本文はStatementである必要があります。ローカル変数の宣言は、Statementのオプションではありません。BlockStatementのオプションです。

これは非常に慎重です。意図的に無意味なコードを書かないようにすることです。 forループやifステートメントなどの中で唯一のステートメントとしてローカル変数を宣言することには意味がありません。それはどこからでも範囲外になるので、なぜ宣言しますか?

ブロック内で唯一のステートメントである場合はまだ意味がありませんが、言語がそうしないようにするのは難しいでしょう。

関連する問題