Почему Java не позволяет мне присваивать значение конечной переменной в блоке catch после установки значения в блоке try, даже если оно не является возможно, чтобы окончательное значение было записано в случае исключения.Назначение значения по умолчанию для конечной переменной в случае исключения в Java
Вот пример, который демонстрирует проблему:
public class FooBar {
private final int foo;
private FooBar() {
try {
int x = bla();
foo = x; // In case of an exception this line is never reached
} catch (Exception ex) {
foo = 0; // But the compiler complains
// that foo might have been initialized
}
}
private int bla() { // You can use any of the lines below, neither works
// throw new RuntimeException();
return 0;
}
}
Проблема не трудно обойти, но я хотел бы понять, почему компилятор не принимает это.
Заранее благодарим за любые поступления!
Хорошо, если вы поймаете общее «Исключение», возможно ли, что что-то произойдет сразу после/во время 'foo = x', что вызовет исключение? Может быть, компилятор «играет в безопасности»? – FromCanada
Ну вот в чем вопрос. Но я действительно сомневаюсь, что назначение может привести к тому, что исключение будет выброшено и все еще будет записывать значение переменной. – Alfonso
Где вы говорите: «В случае исключения эта строка никогда не доходит» Я подозреваю, что компилятор отказывается узнать ваши намерения на этот уровень детализации. Таким образом, все, что он видит, это foo, назначаемый дважды. Возможно, причина в том, что это позволяет компилятору оптимизировать код до foo = bla(), так как x в конечном итоге лишнее? Просто размышляю. – greim