1. ホーム
  2. java

[解決済み] try/catchによる最終的な変数の割り当て

2023-08-28 13:09:04

質問

私はそれが良いプログラミングの習慣だと信じているので、すべての(ローカルまたはインスタンス)変数を 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
}

一時的な変数に頼らずにこれを行う方法はあるのでしょうか?(あるいは、これは最終的なモディファイアのための適切な場所ではないのでしょうか?)

どのように解決するのですか?

一つの方法として、(非 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;
  }
}