Пробные и конечные переменные
У меня для тебя очень глупый вопрос:)
Например, у меня есть следующий фрагмент кода:
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();
}
Это приведет к переназначению переменной , поэтому вы получаете сообщение об ошибке.