1
class Demo {
    public static void main(String args[]) {
        System.out.println("Start main");
        try {
            //exceptional code
            int x=43/0;
        } catch(ArithmeticException e) {
            e.printStackTrace();
        } finally {
            System.out.println("final code");
        }
        System.out.println("End main");
    }
}

finally上記のコードを使用して、ブロックのメカニズムを理解しました。この場合、私が観察したのは、その catch ブロックがなくても、finally ブロックが実行され、例外が発生したことを示していることです。しかし、私が観察した違いは、catch ブロックが使用されていない場合、「メインの終了」が出力されないことです。catch 句を使用して例外を処理しない場合でも、finally ブロックが実行される理由を知りたいです。そして、finally ブロックの基本的な機能が何であるかを知りたいです。

4

4 に答える 4

5

最後に、例外があるかどうかに関係なく、コードを実行するためにブロックが使用されます。最後に、関連する try ブロックに対して常に実行されます。

通常、finally は、try ブロックで開かれたリソースを閉じるために使用されます。finally でそうする理由は、例外の有無に関係なく、リソースを閉じる必要があるためです。しかし、Java 7 では、AutoCloseable リソースに対して try with resource を使用する場合、実際にそれを気にする必要はありません。

あなたのコードでは、finally の関連性は、finally がどのように機能するかを学ぶこと以外には何もありません。

finally の詳細: http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

および同じリンクからのメモ:

重要: finally ブロックは、リソース リークを防止するための重要なツールです。ファイルを閉じるとき、またはリソースを回復するときは、コードを finally ブロックに配置して、リソースが常に回復されるようにします。

Java SE 7 以降を使用している場合は、このような状況で try-with-resources ステートメントを使用することを検討してください。これにより、不要になったシステム リソースが自動的に解放されます。

于 2013-08-17T01:39:45.813 に答える
1

tryまたはcatchブロックで何が起こっても、そのfinally原因により、実行されることが保証されます*。

* /ブロックで実行中のfinally電流を中断または強制終了した場合にのみ、ブロックは実行されません。Threadtrycatch

これはより具体的なドキュメントです。

于 2013-08-17T01:48:18.007 に答える
0

try-catch-finally ブロックまたは try-with-resources ブロックを Java で使用して、C++ のオブジェクト ファイナライザーと同様の機能を実現します。

これらは例外処理で使用されますが、ステートメント ブロックのおそらく最も重要な機能は、ブロックfinally内のコードの実行中に開かれたり作成されたりしたリソースを閉じたり解放したりすることですtry

オブジェクトのファイナライザーは Java に (ある方法で) 存在しますが、オブジェクトのファイナライズにはほとんど使用しないでください。

于 2013-08-17T04:15:46.280 に答える
0

Javaチュートリアルから:

try ブロックが終了すると、finally ブロックが常に実行されます。これにより、予期しない例外が発生した場合でも、finally ブロックが実行されます。しかし、finally は例外処理以外にも役立ちます。プログラマは、return、continue、break によってクリーンアップ コードが誤ってバイパスされるのを防ぐことができます。例外が予想されない場合でも、最終ブロックにクリーンアップ コードを配置することは常に良い方法です。

したがって、 などのアクションが実行されることを保証する必要があるが、そのsomePrintWriter.close()前に例外を処理したい場合は、finally ブロックがそれを実行します。

于 2013-08-17T02:19:54.470 に答える