Почему компилятор Java (назад, 1997, 1995?) Был разработан, чтобы не оценивать присвоение конечных переменных при наличии try-catch?If полностью спроектирован, чтобы гарантировать назначение (или нет) через if, переключиться, в то время как, через вызовы методов ... но не через try-catch в моем примере.
final boolean myFinal;
try {
myFinal = true;
} catch (final Exception e) {
myFinal = false;
}
В этом наиболее упрощенном примере myFinalопределено, что может быть не назначено.
На поверхности нет ничего, что могло бы помешать присвоению myFinal истины.
В чем причина этого?
Этот лот дает намправила компилятора, но не логическое обоснование, за исключением философии высокого уровня назначения / отмены назначения: https://docs.oracle.com/javase/specs/jls/se7/html/jls-16.html#jls-16.2.15
Очевидно, что исключение не выдается кодом внутри блока try, поскольку ничего такого, чтовыдает любые исключения вообще - проверено или нет.
Может ли случиться так, что, пока поток находится внутри этого блока try, могут возникать исключения, которые могут возникнуть в этом потоке, например, OOM или другие проблемы низкого уровня,и, таким образом, компилятор не может быть уверен, что isValid: = true действительно произошло или нет?
Я по какой-то другой причине », это путьэто "... Java тщательно продумала свой строгий подход к своему компилятору, и здесь явно принято важное решение о том, как это обрабатывается в try-catch.Просто нужно знать, что это такое.
Рич