Javaのtry-with-resources文を完全ガイド!初心者でもわかるリソースの自動クローズ方法
生徒
「Javaでファイルを扱うときに、リソースを自動で閉じる方法ってあるんですか?」
先生
「ありますよ。try-with-resources文を使うことで、ファイルやストリームなどのリソースを自動的に閉じることができます。」
生徒
「それって普通のtry-catchとはどう違うんですか?」
先生
「では、try-with-resourcesの基本的な使い方と仕組みを一緒に見ていきましょう!」
1. try-with-resources文とは?
Javaのtry-with-resources文は、Java 7から導入された機能で、リソースの自動解放を目的としています。たとえば、BufferedReaderやFileInputStreamなどを使った後に、close()メソッドを呼び忘れるとリソースリークの原因になります。
しかしtry-with-resourcesを使えば、例外が発生しても確実にリソースが閉じられるため、安全でシンプルなコードが書けるのです。
2. 基本的な構文と使い方
Javaでtry-with-resources文を使うときは、以下のような構文になります。リソースの宣言はtry()の括弧の中で行い、あとは通常のtry-catchと同じように書けます。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TryWithResourcesExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("sample.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("ファイル読み込み中にエラーが発生しました: " + e.getMessage());
}
}
}
ポイント:リソースはAutoCloseableインタフェースを実装している必要があります。BufferedReaderやScanner、FileInputStreamなどはすでに実装済みなので、そのまま使えます。
3. 従来のtry-finally文との違い
Java 7以前は、リソースを使った後にfinallyブロックでclose()を呼び出していました。
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("sample.txt"));
String line = reader.readLine();
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
このようにnullチェックやネストが増えて読みにくくなってしまいます。try-with-resources文ならこの煩雑さを解消できるのがメリットです。
4. 複数リソースの同時管理も可能
Javaのtry-with-resources文では、複数のリソースを同時に管理することもできます。カンマ区切りで並べるだけです。
try (
BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
PrintWriter writer = new PrintWriter("output.txt")
) {
String line;
while ((line = reader.readLine()) != null) {
writer.println(line.toUpperCase());
}
} catch (IOException e) {
e.printStackTrace();
}
このように、ファイルの読み込みと書き込みを一括で安全に管理できるのは、実務でも非常に役立ちます。
5. 独自クラスでtry-with-resourcesを使うには?
自作のクラスでtry-with-resources文を使いたい場合は、AutoCloseableインタフェースを実装すればOKです。
public class MyResource implements AutoCloseable {
public void doSomething() {
System.out.println("リソースを使っています...");
}
@Override
public void close() {
System.out.println("リソースを閉じました。");
}
}
public class Main {
public static void main(String[] args) {
try (MyResource resource = new MyResource()) {
resource.doSomething();
}
}
}
リソースを使っています...
リソースを閉じました。
このようにAutoCloseableを実装するだけで、try-with-resources文で自作クラスも安全に使えるようになります。
6. Javaのバージョンによる記述の違い
Java 9からは、try-with-resourcesで事前に宣言した変数をそのまま使えるようになりました。以下のように、外部で定義されたリソースも使えます。
BufferedReader reader = new BufferedReader(new FileReader("sample.txt"));
try (reader) {
System.out.println(reader.readLine());
}
これはJava 9以降の新機能なので、Java 8以前を使っている場合は従来の方法を使いましょう。
7. よくある注意点と失敗例
try-with-resourcesを使う上での注意点をいくつか紹介します。
- リソースは
AutoCloseableまたはCloseableを実装している必要がある - Java 9の構文は、古いJavaバージョンでは使えない
- tryブロック内でnewしていないオブジェクトはJava 9未満では使えない
これらを押さえておけば、Javaのtry-with-resources文をより安全かつ効果的に活用できます。