Java で例外を扱う場合、コードのこの部分を呼び出す人に例外の処理を委任するだけでなく、try-catch ブロックを使用して例外を処理する必要があることがよくあります。 。ただし、例外がスローされたかどうか、またはプログラムの実行フローが正常に完了したかどうかに関係なく、特定のアクション (ファイルを閉じる、データベースへの接続など) を実行する必要がある場合があります。
これらの場合には、finally ブロックが使用されます。このブロックは、catch ブロックの後に配置されます。catch ブロックが使用されていない場合は、try ブロックの後にも配置されます。 finally ブロック内に配置されたコードは、次の 2 つのシナリオで実行されます。
2 つの整数を受け取り、それらの間の除算の結果を返す除算メソッドを考えてみましょう。これは、try-catch ブロックを使用して、ゼロで除算しようとしたときにスローされる例外を処理するとともに、finally ブロックを使用して、リソースがクリーンアップされていることを示すメッセージを出力します。
public static int divide(int a, int b) { try { return a / b; } catch (ArithmeticException e) { System.out.println("Error: " + e.getMessage()); throw e; } finally { System.out.println("Cleaning up resources..."); } }
値 10 と 2 を指定して Division メソッドを呼び出すと、次の出力が得られます。
Cleaning up resources... 5
ご覧のとおり、例外はスローされなかったため、メソッドは除算の結果を返し、finally ブロックが実行されました。ただし、finally ブロックの出力が最初に示されています。一方、値 10 と 0 を指定して割り算メソッドを呼び出すと、次の出力が得られます。
Error: / by zero Cleaning up resources... Exception in thread "main" java.lang.ArithmeticException: / by zero ...
この場合、例外がスローされたため、実行フローが中断され、catch ブロックが実行されましたが、再度例外がスローされる前に、finally ブロックが実行されました。どちらの例でも、取得された結果に関係なく、finally ブロックが常に実行されることがわかりました。
finally ブロックの主な用途は、ファイル、データベース接続、ネットワーク接続を閉じるなど、try ブロックで使用されたリソースを解放することです。これを例示するために、ファイルの内容を読み取り、最初の行を返す readFile メソッドを考えてみましょう。これは、try-catch ブロックを使用して、ファイルを読み取れない場合にスローされる例外を処理するとともに、finally ブロックを使用してファイルを閉じます。
public static String readFile() throws IOException { FileReader reader = null; try { reader = new FileReader("file.txt"); BufferedReader buffer = new BufferedReader(reader); return buffer.readLine(); } catch (IOException e) { System.out.println("Error: " + e.getMessage()); throw new RuntimeException(e); } finally { if (reader != null) reader.close(); } }
readFile メソッドが実行されてファイルを読み取れない場合、次の出力が取得されます。
public static int divide(int a, int b) { try { return a / b; } catch (ArithmeticException e) { System.out.println("Error: " + e.getMessage()); throw e; } finally { System.out.println("Cleaning up resources..."); } }
ご覧のとおり、例外がスローされたため、実行フローが中断され、catch ブロックが実行されましたが、例外を再度スローする前に、finally ブロックが実行されてファイルが閉じられました。一方、file.txt ファイルが Hello world! という内容で作成された場合は、そして readFile メソッドが呼び出されると、例外はスローされずに次の出力が取得されます。
Cleaning up resources... 5
この例で考慮すべきいくつかの側面は次のとおりです:
Java 内での Final の使用は非常に一般的になったため、言語自体にリソース管理を簡素化できる代替手段である try-with-resources ブロックが用意されています。このブロックは、リソースの使用終了時にリソースを自動的に閉じる役割を担うため、リソースを解放するためにfinallyブロックを使用する必要はありません。ただし、特定のケースでは、finally ブロックが依然として有用であり、両方のオプションを一緒に使用できることに注意することが重要です。
以上がJavaのfinallyブロックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。