Окончательное присвоение переменной с помощью try/catch

Поскольку я считаю, что это хорошая практика программирования, я делаю все свои (локальные или экземплярные) переменные final если они предназначены для написания только один раз.

Однако я заметил, что когда присвоение переменной может вызвать исключение, вы не можете сделать указанную переменную окончательной:

final int x;
try {
    x = Integer.parseInt("someinput");
}
catch(NumberFormatException e) {
    x = 42;  // Compiler error: The final local variable x may already have been assigned
}

Есть ли способ сделать это, не прибегая к временной переменной? (или это не подходящее место для финального модификатора?)

2 ответа

Решение

Одним из способов сделать это является введение (неfinal) временная переменная, но вы сказали, что не хотите этого делать.

Другой способ - переместить обе ветви кода в функцию:

final int x = getValue();

private int getValue() {
  try {
    return Integer.parseInt("someinput");
  }
  catch(NumberFormatException e) {
    return 42;
  }
}

Будет ли это практичным, зависит от конкретного случая использования.

В общем, пока x локальная переменная с соответствующей областью действия, наиболее практичным общим подходом может быть оставить ееfinal,

Если, с другой стороны, x является переменной-членом, мой совет будет использовать неfinal временно при инициализации:

public class C {
  private final int x;
  public C() {
    int x_val;
    try {
      x_val = Integer.parseInt("someinput");
    }
    catch(NumberFormatException e) {
      x_val = 42;
    }
    this.x = x_val;
  }
}

Нет, это не то место, представьте, что в вашем блоке try и catch вы получили более 1 оператора, первый говорит: x = 42. После некоторых других операторов блок try завершается неудачно, и он переходит в блок catch, где ваш Говоря х = 30. Теперь вы определили х дважды.

Другие вопросы по тегам