Почему программа не позволяет инициализировать статическую конечную переменную?

я наткнулся на код 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.


поскольку компилятор дал вам такую ошибку, указывающую, что переменная была создана (и, возможно, изменена) где-то еще. Хорошо изменить имя переменной, где бы она ни появлялась в коде.