ホームページ > Java > &#&チュートリアル > Javaのfinallyブロック

Javaのfinallyブロック

Mary-Kate Olsen
リリース: 2024-11-13 02:10:02
オリジナル
624 人が閲覧しました

El bloque finally en Java

Java で例外を扱う場合、コードのこの部分を呼び出す人に例外の処理を委任するだけでなく、try-catch ブロックを使用して例外を処理する必要があることがよくあります。 。ただし、例外がスローされたかどうか、またはプログラムの実行フローが正常に完了したかどうかに関係なく、特定のアクション (ファイルを閉じる、データベースへの接続など) を実行する必要がある場合があります。

これらの場合には、finally ブロックが使用されます。このブロックは、catch ブロックの後に配置されます。catch ブロックが使用されていない場合は、try ブロックの後にも配置されます。 finally ブロック内に配置されたコードは、次の 2 つのシナリオで実行されます。

  • try ブロックが終了し、例外がスローされなかったとき。
  • 例外が発生すると、実行フローが中断され、catch ブロックが実行されます。

例1

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 ブロックが常に実行されることがわかりました。

例 2

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
ログイン後にコピー
ログイン後にコピー

この例で考慮すべきいくつかの側面は次のとおりです:

  • リーダー変数は、finally ブロックからアクセスできるように、try ブロックの外で宣言されています。つまり、両方のブロックのスコープ内にあります。
  • ファイルを閉じる前にリーダー変数が null と異なるかどうかを確認しました。ファイルを開けない場合、この変数は null のままになり、ファイルを閉じようとすると例外がスローされるためです。
  • finally ブロック内でファイルを閉じようとしたときに close メソッドがスローする可能性のある例外は処理されず、メソッド シグネチャに伝播されます。処理したい場合は、try-catch でラップできます。 finally ブロック内のブロック。

結論

Java 内での Final の使用は非常に一般的になったため、言語自体にリソース管理を簡素化できる代替手段である try-with-resources ブロックが用意されています。このブロックは、リソースの使用終了時にリソースを自動的に閉じる役割を担うため、リソースを解放するためにfinallyブロックを使用する必要はありません。ただし、特定のケースでは、finally ブロックが依然として有用であり、両方のオプションを一緒に使用できることに注意することが重要です。

以上がJavaのfinallyブロックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート