¿Se podría reasignar una variable final en catch, incluso si la asignación es la última operación en try?

Estoy bastante convencido de que aquí

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

i posiblemente no se haya asignado ya si el control llega al bloque catch. Sin embargo, el compilador de Java no está de acuerdo y reclamathe final local variable i may already have been assigned.

¿Todavía me falta algo de sutileza o es solo una debilidad del modelo utilizado por la especificación del lenguaje Java para identificar posibles reasignaciones? Mi principal preocupación son cosas comoThread.stop(), lo que puede resultar en que una excepción sea lanzada "de la nada", pero todavía no veo cómo podría ser lanzada después de la asignación, que aparentemente es la última acción dentro del bloque try.

El lenguaje de arriba, si está permitido, haría que muchos de mis métodos sean más simples. Tenga en cuenta que este caso de uso tiene soporte de primera clase en idiomas, como Scala, que emplea constantementeTal vez monada:

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

Creo que este caso de uso sirve como una buena motivación para permitir ese caso especial dondei esdefinitivamente sin asignar dentro del catch-block.

ACTUALIZAR

Después de pensarlo, estoy aún más seguro de que esto es solo una debilidad del modelo JLS: si declaro el axioma "en el ejemplo presentado,i definitivamente no está asignado cuando el control llega al bloque de captura ", no entrará en conflicto con ningún otro axioma o teorema. El compilador no permitirá ninguna lectura dei antes de que se asigne en el bloque de captura, por lo que el hecho de sii ha sido asignado o no puede ser observado.

Respuestas a la pregunta(8)

Su respuesta a la pregunta