Uma variável final poderia ser reatribuída na captura, mesmo se a atribuição for a última operação em try?

Estou bastante convencido de que aqui

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

i possivelmente não pode já ter sido atribuído se o controle atingir o bloco catch. No entanto, o compilador Java discorda e afirmathe final local variable i may already have been assigned.

Ainda há alguma sutileza que estou perdendo aqui, ou isso é apenas uma fraqueza do modelo usado pela especificação da linguagem Java para identificar potenciais reatribuições? Minha principal preocupação são coisas comoThread.stop(), o que pode resultar em uma exceção sendo lançada "fora do ar", mas ainda não vejo como ela pode ser lançada após a atribuição, que aparentemente é a última ação dentro do try-block.

O idioma acima, se permitido, tornaria muitos dos meus métodos mais simples. Observe que este caso de uso tem suporte de primeira classe em idiomas, como o Scala, que utiliza consistentementeTalvez Mônada:

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

Eu acho que este caso de uso serve como uma boa motivação para permitir que um caso especiali édefinitivamente não atribuído dentro do bloco catch.

ATUALIZAR

Depois de algum pensamento, estou ainda mais certo de que isso é apenas uma fraqueza do modelo JLS: se eu declarar o axioma "no exemplo apresentado,i é definitivamente não atribuído quando o controle atinge o bloco catch ", ele não entrará em conflito com nenhum outro axioma ou teorema. O compilador não permitirá nenhuma leitura dei antes de ser atribuído no bloco de captura, então o fato sei foi atribuído ou não pode ser observado.

questionAnswers(8)

yourAnswerToTheQuestion