为什么程序不允许初始化静态最终变量?

时间:2013-09-16 16:57:08

标签: java static final

我遇到了下面的Java代码,起初看起来很不错但从不编译:

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

以下是IDE中出现的错误消息: 可能已经分配了变量USER_ID。

静态最终变量的赋值是否有问题?

3 个答案:

答案 0 :(得分:19)

最终变量在构造函数或初始化程序块中最多允许一个赋值。这不能编译的原因是Java代码分析器在分支中看到USER_ID的两个赋值,它们看起来并不相互排斥。

解决这个问题很简单:

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

答案 1 :(得分:4)

您已使用赋值运算符在以下行中抛出异常:

USER_ID = getUserIdFromEnvironment();

表示编译器认为存在赋值的可能性,特别是考虑到它被声明为final

答案 2 :(得分:0)

由于编译器给出了一种错误,表明该变量已经在其他地方创建(并且可能已更改)。最好在代码中更改变量的名称。