9

I came across the Java code below which looks good at first but never compiles :

public class UnwelcomeGuest {

    public static final long GUEST_USER_ID = -1;
    private static final long USER_ID;

    static {
        try {
            USER_ID = getUserIdFromEnvironment();
        } catch (IdUnavailableException e) {
            USER_ID = GUEST_USER_ID;
            System.out.println("Logging in as guest");
        }
    }

    private static long getUserIdFromEnvironment()
            throws IdUnavailableException {
        throw new IdUnavailableException(); // Simulate an error
    }

    public static void main(String[] args) {
        System.out.println("User ID: " + USER_ID);
    }
}//Class ends here


//User defined Exception
class IdUnavailableException extends Exception {

     IdUnavailableException() { }

}//Class ends here

Below is the error message which comes in the IDE : variable USER_ID might already have been assigned.

Is there any problem with the value assignment to the static final variable ?

4

3 に答える 3

19

最終変数は、コンストラクターまたは初期化ブロックで最大 1 つの割り当てを許可します。これがコンパイルされない理由は、Java コード アナライザーがUSER_ID相互に排他的ではない分岐で への 2 つの割り当てを検出するためです。

この問題を回避するのは簡単です:

static {
    long theId;
    try {
        theId = getUserIdFromEnvironment();
    } catch (IdUnavailableException e) {
        theId = GUEST_USER_ID;
        System.out.println("Logging in as guest");
    }
    USER_ID = theId;
}
于 2013-09-16T16:59:56.840 に答える
4

次の行で代入演算子を使用して例外をスローしたという事実:

USER_ID = getUserIdFromEnvironment();

は、特に として宣言されているという事実を考えると、代入の可能性があるとコンパイラが考えていることを意味しfinalます。

于 2013-09-16T16:59:57.840 に答える
0

コンパイラがこの種のエラーを表示したため、変数が別の場所で作成 (およびおそらく変更) されたことを示します。コード内のどこにでも変数の名前を変更することをお勧めします。

于 2013-09-16T17:05:21.800 に答える