1. 導入:あの「長い例外処理」にさよなら
Javaでファイルやネットワークを扱う際、使い終わったリソースを確実に閉じる(closeする)のは鉄則です。
しかし、これまでの書き方だと、例外処理が重なってコードがどんどん読みづらくなっていました。
最近、Javaの比較的新しい構文(try-with-resources)を知り、あまりのスマートさに「これだ!」と感動したので、その納得感を共有します。
2. 以前の書き方:finallyが「泥臭い」
まずは、私が「これ、なんとかならないかな……」と思っていた昔ながらの書き方です。
【検証コード:TraditionalTry.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】
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で使うためにscannerをtryの外側で宣言していましたが、新しい書き方ではtry内部だけで有効です。変数の影響範囲が狭まるのは、バグを防ぐ上でも非常に重要です。
5. まとめ:道具を知るとコードが変わる
「ファイルを閉じる」という当たり前の作業が、構文一つでここまで美しくなることに感動しました。 Javaは歴史が長い言語ですが、こうして少しずつ「人間が楽に、安全に書ける」ように進化しているのだと実感しています。新しい書き方を知るたびに、自分のコードが洗練されていくのが本当に楽しいです!
0 件のコメント:
コメントを投稿