モジュールのレッスン (2/2)
リソースを試す
古いバージョンの Java では、明示的に閉じる必要があるリソース (ファイル、データベース接続、ネットワーク ストリームなど) を管理するには、リソースが確実に閉じられるようにするために必須の finally ブロックが必要でした。これにより、冗長でリークが発生しやすいコードが生成されました。
Java 7 では try-with-resources ステートメントが導入されました。これは、AutoCloseable インターフェイスを実装している場合に、try ブロック内で宣言されたすべてのリソースの自動クローズを保証します。
構文
リソースは、try キーワードの直後に括弧内で宣言および初期化されます。
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line = br.readLine();
System.out.println(line);
} catch (IOException e) {
System.out.println("I/O Error: " + e.getMessage());
}
// br is closed automatically here, even if an exception occurs複数のリソースの宣言
同じ try ブロック内で複数のリソースをセミコロン ; で区切ってインスタンス化できます。リソースは宣言とは逆の順序で閉じられます。
try (
FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt")
) {
// Use resources
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}カスタムリソースの作成
カスタム リソースは、java.lang.AutoCloseable を実装し、close() メソッドをオーバーライドする限り、try-with-resources ブロックで使用できます。
public class DatabaseConnection implements AutoCloseable {
public void query(String sql) {
System.out.println("Running query: " + sql);
}
@Override
public void close() {
System.out.println("Connection closed!");
}
}自分で試してみてください
try-with-resources ステートメントを使用して readFile メソッドを完了し、パス上の FileReader をラップする BufferedReader を初期化します。 catch ブロックで IOException をインターセプトし、「ファイル読み取りエラー」を出力します。
ヒントを表示
tryの直後に括弧内にBufferedReaderを宣言し、IOExceptionのハンドリングを実装します。
3 回の試行後に解決策が利用可能になります
try-with-resources ブロック内でカスタム リソース CustomResource をインスタンス化し、その上で doWork() メソッドを呼び出し、「Error」を出力して例外を処理します。
ヒントを表示
`try (CustomResource res = new CustomResource())` を使用し、その中で `res.doWork();` を呼び出します。
3 回の試行後に解決策が利用可能になります
同じ try-with-resources 構造で FirstResource と SecondResource の両方を宣言します。 「エラー」を出力して例外を処理します。
ヒントを表示
`try` の括弧内の 2 つのリソースの宣言をセミコロン `;` を使用して区切ります。
3 回の試行後に解決策が利用可能になります