web-dev-qa-db-ja.com

Javaキャッチせずにキャッチキャッチせずに最後にブロックする

いくつかの新しいコードをレビューしています。プログラムにはtryとfinallyブロックのみがあります。 catchブロックが除外されているため、例外またはスロー可能な何かに遭遇した場合、tryブロックはどのように機能しますか? finallyブロックに直接移動するだけですか?

116
NullPointer0x00

Tryブロック内のコードのいずれかがチェック済み例外をスローできる場合、メソッドシグネチャのthrows句に表示する必要があります。未チェックの例外がスローされると、メソッドからバブルアウトされます。

Finallyブロックは、例外がスローされるかどうかに関係なく、常に実行されます。

122
duffymo

try/finallyに関する小さなメモ:最終的には常に

  • System.exit()が呼び出されます。
  • JVMがクラッシュします。
  • try{}ブロックは終了しません(例:無限ループ)。
88
Peter Lawrey

Java言語仕様(1) try-catch-finallyの実行方法を説明します。キャッチを持たないことは、与えられたThrowableをキャッチできるキャッチを持たないことと同等です。

  • Tryブロックの実行が値Vのスローのために突然完了した場合、選択肢があります:
    • Vの実行時タイプがtryステートメントのcatch句のパラメーターに割り当て可能な場合、…
    • Vの実行時タイプがtryステートメントのcatch句のパラメーターに割り当て可能でない場合、、finallyブロックが実行されます。次に、選択肢があります。
      • Finallyブロックが正常に完了すると、値Vがスローされるため、tryステートメントが突然完了します。
      • 最終ブロックが理由Sで突然終了した場合、tryステートメントは理由Sで突然終了します(値Vのスローは破棄され忘れられます)。

(1) try-catch-finallyの実行

36

内側のブロックは、外側のブロックに例外をスローする前に実行されます。

public class TryCatchFinally {

  public static void main(String[] args) throws Exception {

    try{
        System.out.println('A');
        try{
            System.out.println('B');
            throw new Exception("threw exception in B");
        }
        finally
        {
            System.out.println('X');
        }
        //any code here in the first try block 
        //is unreachable if an exception occurs in the second try block
    }
    catch(Exception e)
    {
        System.out.println('Y');
    }
    finally
    {
        System.out.println('Z');
    }
  }
}

結果

A
B
X
Y
Z
14
skipchaser

Finallyブロックは、tryブロックが終了した後に常に実行されます。tryが正常に終了したか、例外(er、スロー可能)により異常終了したかは関係ありません。

Tryブロック内のコードのいずれかによって例外がスローされた場合、現在のメソッドは(finallyブロックの実行後に)同じ例外を単に再スロー(または引き続きスロー)します。

Finallyブロックが例外/エラー/スロー可能オブジェクトをスローし、保留中のスロー可能オブジェクトがすでにある場合は、見苦しくなります。率直に言って、私は何が起こるかを正確に忘れています(何年も前の認定の場合はそうです)。 I 思考両方のスロー可能オブジェクトがリンクされますが、「最後に」バーフされる前に元の問題を取得するために、いくつかの特別なブードゥーを実行する必要があります(つまり、検索するメソッド呼び出し)えー、投げた。

ちなみに、Javaにはデストラクタがないため、try/finallyはリソース管理のための非常に一般的なことです。

例えば。 -

r = new LeakyThing();
try { useResource( r); }
finally { r.release(); }  // close, destroy, etc

「最後に」もう1つのヒント:doキャッチする場合、特定の(予想される)スロー可能サブクラスをキャッチするか、単に "Throwable"、not "例外」、一般的なキャッチオールエラートラップ。リフレクショングーフなどの問題が多すぎると、「例外」ではなく「エラー」がスローされ、次のようにコード化された「すべてをキャッチ」することで、それらは正しくスリップします。

catch ( Exception e) ...  // doesn't really catch *all*, eh?

代わりにこれを行います:

catch ( Throwable t) ...
6
Roboprog

バージョン7より前のJavaバージョンでは、これらの3つの組み合わせtry-catch-finally ...を使用できます。

try - catch
try - catch - finally
try - finally

finallyまたは/およびtryブロックで何が起こっていても、catchブロックは常に実行されます。したがって、catchブロックがない場合、例外はここで処理されません。

ただし、コードのどこかに例外ハンドラが必要になります-もちろん、アプリケーションを完全にクラッシュさせたい場合を除きます。それは、アプリケーションのアーキテクチャに応じて、そのハンドラがどこにあるかによって異なります。

  • Java tryブロックの後に、catchまたはfinallyブロックが必要です。
  • 各tryブロックには、0個以上のcatchブロックがありますが、finallyブロックは1つだけです。
  • プログラムが終了した場合(System.exit()を呼び出すか、プロセスを中止させる致命的なエラーを引き起こすことにより)、finallyブロックは実行されません。
3
roottraveller

例外またはスロー可能なものが発生した場合、tryブロックはどのように機能しますか

例外がキャッチされない他の場合と同様に、例外はブロックからスローされます。

Finallyブロックは、tryブロックの終了方法に関係なく、一致するキャッチがあるかどうかにかかわらず、キャッチがあるかどうかに関係なく実行されます。

Catchブロックとfinallyは、tryブロックの直交部分です。どちらかまたは両方を持つことができます。 Java 7を使用すると、どちらも使用できなくなります。

2
Andy Thomas

そのプログラムで試してみませんか? finallyブロックに移動し、finallyブロックを実行しますが、例外は処理されません。しかし、その例外はfinallyブロックで無効にすることができます!

1

Finallyブロックは、tryブロックが完了した後に実行されます。 finallyブロックを離れるときにtryブロック内に何かがスローされた場合、実行されます。

1
mP.