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

前端之家收集整理的这篇文章主要介绍了java – 为什么程序不允许初始化静态最终变量?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我看到下面的 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可能已经被分配.

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

解决方法

最终变量允许在构造函数或初始化程序块中至多有一个赋值.不编译的原因是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;
}

猜你在找的Java相关文章