Czy ostatnia zmienna może zostać ponownie przypisana do połowu, nawet jeśli przypisanie jest ostatnią operacją w próbie?

Jestem tutaj całkiem przekonany

final int i;
try { i = calculateIndex(); }
catch (Exception e) { i = 1; }

i nie może być już przypisany, jeśli sterowanie osiągnie blok-catch. Jednak kompilator Java nie zgadza się i twierdzithe final local variable i may already have been assigned.

Czy nadal brakuje mi subtelności, czy też jest to słabość modelu używanego przez specyfikację języka Java do identyfikacji potencjalnych zmian przypisania? Moim głównym zmartwieniem są takie rzeczyThread.stop(), co może skutkować wyrzuceniem wyjątku „z powietrza”, ale nadal nie widzę, jak można go rzucić po przydzieleniu, co jest najwyraźniej ostatnią akcją w bloku prób.

Powyższy idiom, jeśli jest dozwolony, ułatwiłby wiele z moich metod. Zauważ, że ten przypadek użycia ma pierwszorzędną obsługę w językach, takich jak Scala, które konsekwentnie używająMoże monad:

final int i = calculateIndex().getOrElse(1);

Myślę, że ten przypadek użycia służy jako całkiem dobra motywacja, aby pozwolić na jeden specjalny przypadeki jestzdecydowanie nieprzypisany w bloku catch.

AKTUALIZACJA

Po pewnym przekonaniu jestem nawet bardziej pewny, że to tylko słabość modelu JLS: jeśli zadeklaruję aksjomat w przedstawionym przykładzie,i jest zdecydowanie nieprzypisane, gdy kontrola osiągnie blok catch ”, nie będzie kolidować z żadnym innym aksjomatem lub twierdzeniem. Kompilator nie pozwoli na odczyti zanim zostanie on przypisany w bloku catch, więc fakt, czyi został przypisany lub nie może być nieobserwowany.

questionAnswers(8)

yourAnswerToTheQuestion