Окончательное присвоение переменной с помощью 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. Теперь вы определили х дважды.