Почему программа не позволяет инициализировать статическую конечную переменную?
я наткнулся на код 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 ответов
конечные переменные позволяют не более одного назначения в конструкторе или блоке инициализатора. Причина, по которой это не компилируется, заключается в том, что анализатор кода 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;
}
тот факт, что вы использовали оператор присваивания для создания исключения в следующей строке:
USER_ID = getUserIdFromEnvironment();
означает, что компилятор считает, что существует возможность назначения, особенно учитывая тот факт, что он объявлен как final
.
поскольку компилятор дал вам такую ошибку, указывающую, что переменная была создана (и, возможно, изменена) где-то еще. Хорошо изменить имя переменной, где бы она ни появлялась в коде.