I am quite convinced that here
final int i; try { i = calculateIndex(); } catch (Exception e) { i = 1; }
i cannot possibly have
i
Not quite as clean (and I suspect what you are already doing). But this only adds 1 extra line.
final int i; int temp; try { temp = calculateIndex(); } catch (IOException e) { temp = 1; } i = temp;