Почему компилятор Java предназначен, по-видимому, для того, чтобы не запрашивать назначение окончательных переменных через try-catch? - PullRequest
3 голосов
/ 14 мая 2019

Почему компилятор 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.Просто нужно знать, что это такое.

Рич

...