13

誰かがこのコードの何が悪いのか説明できますか?

    public class Base {


    static {
        i = 1;
        System.out.println("[Base]after static init block i=" + i);// LINE 1
        System.out.println("*************************************");
        System.out.println();
    }
    static int i;



    public static void main(String[] args) {
        System.out.println(Base.i);
    }
}

LINE 1にコメントすると、すべてOKで、Base.mainメソッドは「1」を出力します。LINE 1-がコメント化されていない場合、コンパイル時エラーが発生しました:「不正な前方参照」。したがって、静的initブロックで理解しているように、iの値を設定することはできますが、読み取ることはできません。誰かが理由を説明できますか?

4

5 に答える 5

27

これは、初期化中のフィールドの使用に関する制限のためです。特に、宣言された行の前の静的初期化ブロック内での静的フィールドの使用は、完全に修飾されていない限り(あなたの場合)、式の左側(つまり割り当て)でのみ行うことができますBase.i

たとえば、int j = i;直後に挿入i = 1;すると同じエラーが発生します。

この問題を解決する明白な方法は、静的初期化ブロックのstatic int i; に宣言することです。

于 2013-01-31T11:46:35.263 に答える
9

「不正な前方参照」とは、変数が定義される前に変数を使用しようとしていることを意味します。

観察される動作は、javacバグの症状です(このバグレポートを参照してください)。この問題は、OpenJDK7などの新しいバージョンのコンパイラで修正されているようです。

見て

静的最終フィールドの不正な前方参照エラー

于 2013-01-31T11:46:17.943 に答える
3

静的ブロックのi変数にBaseを追加するか、ブロックの前にstaticintiを宣言する必要があります。他の解決策は、静的ブロックの代わりに静的メソッドを作成することです。

static {
    Base.i = 1;
    System.out.println("[Base]after static init block i=" + Base.i);// LINE 1
    System.out.println("*************************************");
    System.out.println();
}
于 2013-01-31T11:52:25.750 に答える
2

コードを次のように変更します。

int i;
static {
    i = 1;
    System.out.println("[Base]after static init block i=" + i);// LINE 1
    System.out.println("*************************************");
    System.out.println();
}
于 2013-01-31T11:47:26.013 に答える
0
A variable should always be textually declared before used else Illegal forward Reference comes into picture. Only Exception to this Statement is : If prior to declaration it is used on LHS of expression. Ex :
Snippet 1: 
 static{
   x = 10;
}
static int x;  
Above snippet will work.

Snippet 2:
static{
  System.out.println("Value of x: " + x)  
}
static int x;
  This will give CTE, because x isnt LHS of expression.

Keeping those conditions in mind we can avoid Illegal Forward ref issue in our code.


Thanks
于 2019-12-05T03:46:53.000 に答える