В примере 1 условие всегда истинно
Мы знаем это, но компилятор недостаточно умен, чтобы обнаружить этот факт. Мы знаем это, потому что мы прочитали код и оценили выражение i == 10
в наших головах. Компилятор этого не делает. Компиляторы могут оценивать константные выражения , а i == 10
не является константным выражением, поскольку оно включает переменную i
.
компилятор не знает, что i == 10
всегда верно в примере 1, поэтому он думает, что i == 10
может быть ложным. В таком случае j
не будет инициализирован, следовательно, ошибка. Вот почему вам нужна ветка else в примере 2 для удовлетворения компилятора.
Вы можете сделать i == 10
константным выражением, сказав, что i
равно final
:
final int i = 10;
Таким образом, компилятор знает, что значение i
является постоянным, и j
всегда будет инициализироваться, а ошибка будет go исчезать.