Java 基礎からマスターまで — 第7回
例外とtry-with-resourcesで失敗を処理する
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
ファイル、ネットワーク、入力値はいつでも失敗する可能性があります。 Javaの例外とリソース管理文法は、失敗を伝え、どのパスでもリソースを閉じるために使用されます。
例外を渡す
public Settings loadSettings(Path path) throws IOException {
String json = Files.readString(path);
return parser.parse(json);
}
呼び出し側が回復方法を決定する必要がある場合は、例外を無理やり内部で隠さないでください。 コンテキストを追加するときは、元の例外を原因として保存しなければならない。
try {
settings = loadSettings(path);
} catch (IOException error) {
logger.warn("settings load failed", error);
settings = Settings.defaults();
}
処理できる例外だけをキャッチする。 すべてのExceptionをつかんで何もしないと、実際のバグまで正常のように進むことができる。
try-with-resources
public List<String> readLines(Path path) throws IOException {
try (BufferedReader reader = Files.newBufferedReader(path)) {
return reader.lines().toList();
}
}
AutoCloseableを実装したオブジェクトを括弧内に作成すると、ブロックの終わりにcloseが呼び出されます。 通常の戻りパスと例外パスの両方でファイルハンドルがクリーンアップされます。
検査例外とランタイム例外
検査例外は、メソッド宣言またはキャッチで処理するかどうかを示します。 IllegalArgumentExceptionなどのランタイム例外は、誤った呼び出し契約やプログラミングエラーによく使用されます。
どちらが無条件に良いのではなく、呼び出し元が回復できる失敗であるかが基準です。
状態が完了したら交換する
Settings loaded = loadSettings(path);
currentSettings = loaded;
新しい値を完全に作成してフィールドに入れると、ロード中に失敗しても既存の設定は保持されます。 例外設計は、多くのキャッチを作成するのではなく、失敗したときにリソースとオブジェクトの状態がどのように残るかを決定することです。