Пробные и конечные переменные

У меня для тебя очень глупый вопрос:)

Например, у меня есть следующий фрагмент кода:

class MyClass {

    public static void main (String[] args) {

        final String status;

        try {
            method1();
            method2();
            method3();
            status = "OK";
        } catch (Exception e) {
            status = "BAD"; // <-- why compiler complains about this line??
        }

    }

    public static void method1() throws Exception {
        // ...
    }

    public static void method2() throws Exception {
        // ...
    }

    public static void method3() throws Exception {
        // ...
    }

}

Вопрос внутри: почему компилятор жалуется на эту строку?

IntelliJ IDEA говорит, что Variable 'status' might already have been assigned to.

Но, как я вижу, мы никогда не достигаем линии (где мы устанавливаем status = "OK") в случае исключительной ситуации. Таким образом, переменная status будет BAD, и все должно быть в порядке. И если у нас нет никакого исключения, мы получим OK. И мы будем устанавливать эту переменную только за один раз.

Любые мысли об этом?

Спасибо за вашу помощь!

Ответ 1

Компилятор Java не видит того, что вы и я видим - либо status получает значение "OK", либо устанавливается на "BAD". Предполагается, что параметр status может быть установлен и генерируется исключение, и в этом случае ему присваивается дважды, а компилятор генерирует ошибку.

Чтобы обойти это, назначьте временную переменную для блока try - catch и назначьте переменную final один раз после этого.

final String status;
String temp;

try {
    method1();
    method2();
    method3();
    temp = "OK";
} catch (Exception e) {
    temp = "BAD";
}

status = temp;

Ответ 2

Что делать, если код, вызвавший исключение, произошел после status = "OK"? Причина, по которой вы получаете ошибку, кажется довольно очевидной.

Возьмите это, например:

final String status;

try {
    status = "OK":
    causeException();
}catch(Exception e) {
    status = "BAD";
}

void causeException() throws Exception() {
    throw new Exception();
}

Это приведет к переназначению переменной , поэтому вы получаете сообщение об ошибке.