我遇到了下面的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。
静态最终变量的赋值是否有问题?
答案 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)
由于编译器给出了一种错误,表明该变量已经在其他地方创建(并且可能已更改)。最好在代码中更改变量的名称。