工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

Java try-with-resources

Java try-with-resources

このチュートリアルでは、リソースを自動的に閉じるための try-with-resources ステートメントについて学習します。

try-with-resources ステートメントは、ステートメントの最後ですべてのリソースを自動的に閉じます。リソースは、プログラムの最後に閉じられるオブジェクトです。

その構文は次のとおりです:

try (resource declaration) {
  // use of the resource
} catch (ExceptionType e1) {
  // catch block
}

上記の構文からわかるように、 try-with-resources を宣言します による声明

<オール>
  • try 内でリソースを宣言してインスタンス化する 句。
  • リソースを閉じるときにスローされる可能性のあるすべての例外を指定して処理する
  • 注: try-with-resources ステートメントは、AutoCloseable インターフェースを実装するすべてのリソースを閉じます。


    try-with-resources を実装する例を見てみましょう

    例 1:リソースで試す

    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("IOException in try block =>" + e.getMessage());
        }
      }
    }
    
    

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

    IOException in try-with-resources block =>test.txt (No such file or directory)
    

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

    Entering try-with-resources block
    Line =>test line
    

    この例では、BufferedReader のインスタンスを使用します。 test.txt からデータを読み取る ファイル。

    BufferedReader の宣言とインスタンス化 try-with-resources の中 try ステートメントは正常に完了するか、例外をスローします。

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


    抑制された例外

    上記の例では、try-with-resources から例外をスローできます。 ステートメント:

    try から例外をスローすることもできます ファイル読み取りとしてのブロックは、さまざまな理由でいつでも失敗する可能性があります。

    try の両方から例外がスローされた場合 ブロックと try-with-resources ステートメント、try からの例外 ブロックがスローされ、try-with-resources から例外が発生します ステートメントは抑制されています。

    抑制された例外の取得

    Java 7 以降では、抑制された例外は Throwable.getSuppressed() を呼び出すことで取得できます。 try によってスローされた例外のメソッド ブロックします。

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

    catch(IOException e) {
      System.out.println("Thrown exception=>" + e.getMessage());
      Throwable[] suppressedExceptions = e.getSuppressed();
      for (int i=0; i<suppressedExceptions.length; i++) {
        System.out.println("Suppressed exception=>" + suppressedExceptions[i]);
      }
    }
    

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

    try-with-resources を使用する利点は次のとおりです。

    1.リソースを閉じるために最後にブロックする必要はありません

    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("Entering try block");
          br = new BufferedReader(new FileReader("test.txt"));
          while ((line = br.readLine()) != null) {
            System.out.println("Line =>"+line);
          }
        } catch (IOException e) {
          System.out.println("IOException in try block =>" + e.getMessage());
        } finally {
          System.out.println("Entering finally block");
          try {
            if (br != null) {
              br.close();
            }
          } catch (IOException e) {
            System.out.println("IOException in finally block =>"+e.getMessage());
          }
    
        }
      }
    }
    
    

    出力

    Entering try block
    Line =>line from test.txt file
    Entering finally block 
    

    上記の例からわかるように、 finally の使用 リソースをクリーンアップするためのブロックは、コードをより複雑にします。

    try...catch に注意してください finally のブロック ブロックも?これは IOException BufferedReader を閉じるときにも発生する可能性があります この finally 内のインスタンス ブロックして、それもキャッチして処理します。

    try-with-resources ステートメントは自動リソース管理を行います . JVM がリソースを自動的に閉じるため、リソースを明示的に閉じる必要はありません。これにより、コードが読みやすくなり、書きやすくなります。


    2.複数のリソースでリソースを試す

    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 を改善しました。 リソースの参照がローカルで宣言されていなくても使用できるように、ステートメントを使用します。上記のコードは、コンパイル エラーなしで実行されるようになりました。


    Java

    1. Java オペレーター
    2. Java コメント
    3. Java if...else ステートメント
    4. Java for-each ループ
    5. Java break ステートメント
    6. Java 文字列
    7. Java インターフェイス
    8. Java匿名クラス
    9. Java アノテーション
    10. Java アサーション
    11. Java ベクトル