2026年1月18日日曜日

【Java】もうclose()で悩まない!「try-with-resources」で例外処理が劇的にスマートになった話

1. 導入:あの「長い例外処理」にさよなら

Javaでファイルやネットワークを扱う際、使い終わったリソースを確実に閉じる(closeする)のは鉄則です。

しかし、これまでの書き方だと、例外処理が重なってコードがどんどん読みづらくなっていました。 

最近、Javaの比較的新しい構文(try-with-resources)を知り、あまりのスマートさに「これだ!」と感動したので、その納得感を共有します。


2. 以前の書き方:finallyが「泥臭い」

まずは、私が「これ、なんとかならないかな……」と思っていた昔ながらの書き方です。

【検証コード:TraditionalTry.java】

Java
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class TraditionalTry {
    public static void main(String[] args) {
        Scanner scanner = null;
        try {
            scanner = new Scanner(new File("test.txt"));
            while (scanner.hasNextLine()) {
                System.out.println(scanner.nextLine());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            // ここが泥臭い!
            if (scanner != null) {
                scanner.close();
                System.out.println("リソースを閉じました。");
            }
        }
    }
}

finally の中でわざわざ null チェックをしてから close() を呼ぶ。もし close() 自体が例外を投げる場合は、さらにその中で try-catch を書くことになり、本質的な処理が埋もれてしまいます。


3. スマートな解決策:try-with-resources

Java 7から導入されたこの構文を使うと、驚くほどシンプルになります。

【検証コード:SmartTry.java】

Java
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class SmartTry {
    public static void main(String[] args) {
        // tryの後の括弧内で宣言するだけ
        try (Scanner scanner = new Scanner(new File("test.txt"))) {
            while (scanner.hasNextLine()) {
                System.out.println(scanner.nextLine());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // ここで自動的にcloseされる!
        System.out.println("tryブロックを抜けると自動でリソースが解放されます。");
    }
}

4. 納得ポイント:ここが「嬉しい」

実際に使ってみて「これ、いいな!」と思ったポイントは2つあります。

  • 書き忘れがない close() を自分で書く必要がないので、「うっかり閉じ忘れてメモリを圧迫した」というミスが物理的に発生しません。

  • 変数のスコープが適切 以前の書き方では、finally で使うために scannertry の外側で宣言していましたが、新しい書き方では try 内部だけで有効です。変数の影響範囲が狭まるのは、バグを防ぐ上でも非常に重要です。


5. まとめ:道具を知るとコードが変わる

「ファイルを閉じる」という当たり前の作業が、構文一つでここまで美しくなることに感動しました。 Javaは歴史が長い言語ですが、こうして少しずつ「人間が楽に、安全に書ける」ように進化しているのだと実感しています。新しい書き方を知るたびに、自分のコードが洗練されていくのが本当に楽しいです!





0 件のコメント:

コメントを投稿

【Java】「あれ、時間が違う?」の謎を解く。OSとJavaが時刻を判断する仕組みとモダンな修正術

1. 導入:9時間のズレが教えてくれたこと ローカルのPCでは正しく動いていたのに、サーバー(Linux)に持っていった途端、時刻が9時間ズレて表示される……。 そんな経験はありませんか?私はあります。この「9時間」という数字は、日本標準時(JST)と協定世界時(UTC)の差。 ...