9

我遇到了下面的 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 可能已被分配。

对静态最终变量的赋值有什么问题吗?

4

3 回答 3

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;
}
于 2013-09-16T16:59:56.840 回答
4

您已使用赋值运算符在以下行中引发 Exception 的事实:

USER_ID = getUserIdFromEnvironment();

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

于 2013-09-16T16:59:57.840 回答
0

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

于 2013-09-16T17:05:21.800 回答