English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java 流程制御

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Java 異常処理

Java 列表(List)

Java Queue(キュー)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Java 他のトピック

Java try-with-resources

このチュートリアルでは、try-with-resources文脈は、自動的にリソースを閉じます。

try-with-resources文脈は、文末で自動的にすべてのリソースを閉じます。リソースはプログラム終了時に閉じる必要があるオブジェクトです。

その文法は以下の通りです:

try (resource declaration) {
  // リソースの使用
} catch (ExceptionType e1) {
  // catch block
}

上記の文法から、以下のようにtryを宣言することができます。-with-resources文脈:

  1. try子句内でリソースを宣言し、インスタンス化します。

  2. リソースを閉じる際に発生する可能性のあるすべての例外を指定し、処理する必要があります。

注意:try-with-resources文脈は、AutoCloseableインターフェースを実装したすべてのリソースを自動的に閉じます。

try文の実現に取り組んでみましょう。-with-resources文脈の例として。

サンプル1:try-with-resources

import java.io.*;
class Main {
  public static void main(String[] args) {
    String line;
    try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
      while ((line = br.readLine()) != null) {
        System.out.println("Line =>")+line);
      }
    } catch (IOException e) {
      System.out.println("tryブロック内のIOException =>" + e.getMessage());
    }
  }
}

test.txtファイルが見つからない場合、出力します。

try中のIOException-with-resources block =>test.txt (ファイルまたはディレクトリが見つかりません)

test.txtファイルが見つかった場合、出力します。

tryに入ります。-with-resources block
Line =>test line

この例では、test.txtファイルからデータを読み取るために使用するインスタンスBufferedReaderが指定されています。

try-with-resources文脈で宣言し、インスタンス化されたBufferedReaderは、try文が正常に終了するかどうかにかかわらず、そのインスタンスを閉じることができます。

例外が発生した場合、例外処理ブロックを使用して、または}}throws キーワードを処理します。

抑制された例外

上記の例では、以下の状況でtry-with-resources ステートメントが例外をスロー:

  • test.txt ファイルが見つかりません。

  • BufferedReader オブジェクトを閉じます。

からも例外を発生させることができます、ファイルの読み取りはさまざまな理由で失敗する可能性があります。

からtry-with-resources ステートメントがすべて例外をスローした場合、try ブロック内の例外がスローされ、try-with-resources ステートメントの例外

抑制された例外の取得

Java 7および更高版本中、try ブロックから発生した例外からThrowable.getSuppressed()メソッドを呼び出して抑制された例外を取得できます。

このメソッドはすべての抑制された例外の配列を返します。catch ブロックで抑制された例外を受け取ります。

catch(IOException e) {
  System.out.println("投げられた例外=>" + e.getMessage());
  Throwable[] suppressedExceptions = e.getSuppressed();
  for (int i = 0; i < suppressedExceptions.length; i++) {
    System.out.println("抑制された例外=>" + suppressedExceptions[i]);
  }
}

使用するtry-with-resourcesの利点

これはtry-with-resourcesの利点:

1.finally ブロックはリソースを閉じる必要はありません

Java 7この機能を導入する前に、リソースの漏洩を避けるためにfinally ブロックを使用してリソースを閉じる必要があります。

これは、以下に似たサンプル1のプログラム。ただし、このプログラムでは、finally ブロックを使用してリソースを閉じます。

サンプル2:使用finally ブロックでリソースを閉じます

import java.io.*;
class Main {
  public static void main(String[] args) {
    BufferedReader br = null;
    String line;
    try {
      System.out.println("进入try ブロック");
      br = new BufferedReader(new FileReader("test.txt"));
      while ((line = br.readLine()) != null) {
        System.out.println("Line =>")+line);
      }
    } catch (IOException e) {
      System.out.println("tryブロック内のIOException =>" + e.getMessage());
    } finally {
      System.out.println("finallyブロックに入ります");
      try {
        if (br != null) {
          br.close();
        }
      } catch (IOException e) {
        System.out.println("finallyブロック内のIOException =>"+e.getMessage());
      }
    }
  }
}

出力結果

tryブロックに入ります
Line =>test.txtファイルからline
finallyブロックに入ります

上の例から分かるように、finallyブロックを使用してリソースをクリーンアップすることで、コードがより複雑になります。

finallyブロック内のBufferedReaderインスタンスを閉じる際にIOExceptionが発生する可能性があることに気づきましたか?そのため、それもキャッチして処理する必要があります。

try-with-resources文の実行自動リソース管理。リソースを明示的に閉じる必要はありません。なぜなら、JVMが自動的にそれらを閉じるからです。これにより、コードが読みやすくなり、書きやすくなります。

2.try-with-resources 複数のリソース

私たちはtry-with-resourcesは、複数のリソースを区切るためにセミコロンを使用して、文の中で複数のリソースを宣言します;

サンプル3:多種のリソースを使用しようと試みます

import java.io.*;
import java.util.*;
class Main {
  public static void main(String[] args) throws IOException{
    try (Scanner scanner = new Scanner(new File("testRead.txt")); 
      PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
      while (scanner.hasNext()) {
        writer.print(scanner.nextLine());
      }
    }
  }
}

このプログラムを実行した際に例外が生成されない場合、ScannerオブジェクトはtestRead.txtファイルから一行を読み取り、新しいtestWrite.txtファイルに書き込みます。

複数の宣言を行う場合、try-with-resources ステートメントはこれらのリソースを逆の順序で閉じます。この例では、まず PrintWriter オブジェクトを閉じ、次に Scanner オブジェクトを閉じます。

Java 9 try-with-resources 強化

Java 7中のこの try-with-resources ステートメントには制限があります。リソースはそのブロック内でローカルに宣言する必要があります。

try (Scanner scanner = new Scanner(new File("testRead.txt"))) {
  // code
}

Javaで、 7リソースをブロックの外に宣言すると、エラーメッセージが投げられます。

Scanner scanner = new Scanner(new File("testRead.txt"));
try (scanner) {
  // code
}

このエラーを解決するために、Java 9 try を改善しました-with-resources ステートメントを使用して、ローカルでリソース参照が宣言されていない場合でも使用できます。現在のコードは、コンパイルエラーを投げずに実行されます。