-3
public class HelloWorld{ //Why is it throwing error here
  final static int i;
     public static void main(String []args){
       int i = call(10);
       System.out.println("Hello World"+i);
     }
     static int call(int y){
         int r= y;
         return r ;
     }
}

上記のプログラムでは、 final static int i;以下のエラーをスローします。誰かがそれがなぜなのか正確に教えてもらえますか. final static int i;メソッド内で宣言された場合も同じよう に機能します。

エラー:

$javac HelloWorld.java 2>&1
HelloWorld.java:1: error: variable i might not have been initialized
public class HelloWorld{
^
1 error
4

5 に答える 5

4

エラーが発生するのは、それが本来の動作であるためです。

JLSから- セクション 8.3.1.2 :

空白の final (§4.12.4) クラス変数が、それが宣言されているクラスの静的初期化子 (§8.7) によって確実に割り当てられていない (§16.8) 場合、コンパイル時エラーになります。

そしてJLSから-セクション16.8

C をクラスとし、V を C で宣言された C の空白の static final メンバー フィールドとする。

  • V は、C の左端の列挙型定数、静的初期化子 (§8.7)、または静的変数初期化子の前では、確実に割り当てられていません (さらに、確実に割り当てられていません)。

これで、静的初期化子静的変数初期化子もないため、最終フィールドは確実に割り当てられていません。

i宣言の時点で、何らかの値を割り当てる必要があります。

final static int i = 0;

またはstaticブロック内(ここでは実際には必要ありません):

final static int i;
static { i = 0; }
于 2013-08-11T13:49:31.750 に答える
2

final変数は、少なくともデフォルトに初期化する必要があります。

static final 変数は、クラスのロードが完了する前に初期化する必要があります。つまり、宣言時または静的ブロックで初期化できます。

したがって、最終変数は次のようになります

 final static int i=0;//initialization at the time of declaration

また

final static int i;

static{
  i=0;//initialization in static block
}
于 2013-08-11T13:50:03.320 に答える
1

同じことが非静的変数にも当てはまります。0 で初期化すれば問題ありません。

final static int i= 0;

しかし、あなたはそれを隠します。new を宣言し、iそれを使用します。あなたの決勝戦iはまったく使用されません。

于 2013-08-11T13:51:15.323 に答える