Подтвердить что ты не робот

Конечное назначение переменной с помощью try/catch

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

Однако я замечаю, что когда присваивание переменной может вызывать исключение, вы не можете сделать указанную переменную 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
}

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

4b9b3361

Ответ 1

Один из способов сделать это - ввести временную переменную (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;
  }
}

Ответ 2

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