web-dev-qa-db-ja.com

キャッチ後にコードの代わりに最終的に使用する理由

なぜこれをする

} catch (SQLException sqle) {
    sqle.printStackTrace();
} finally {
    cs.close();
    rs.close();
}

これの代わりに

} catch (SQLException sqle) {
    sqle.printStackTrace();
}
rs.close();
cs.close();
74

例外がスローされた場合tryブロックの後にコードなしが実行された場合unless例外がキャッチされるためですfinallyブロック内で何が起こっても、tryブロックは常に実行されます。

Catchブロックを見てください。DAOExceptionがスローされます。したがって、catchブロックの後のステートメントは実行されません指定したサンプルでも。あなたが示したもの(ある例外を別の例外にラップする)は、1つの一般的なパターンです-しかし、別の可能性は、キャッチブロックが「誤って」例外をスローすることです。呼び出しの1つが失敗するためです。

さらに、他の例外が存在する可能性がありますdo n't catch-メソッドがそれらをスローすることを宣言したか、未チェックの例外であるためです。 IllegalArgumentExceptionがどこかにスローされたため、本当にリソースをリークしますか?

24
Jon Skeet

例外がスローされた場合、

  • Finally節のコードは、例外がメソッドの残りの実行を中止した場合でも、例外が外側に伝播するときに実行されます。

  • Try/catchブロックの後のコードは、例外がcatchブロックによってキャッチされ、再スローされない限り実行されません。

12
Bert F

なぜなら、finallyブロックの内容が確実に実行されるからです。たとえば、catchブロックには別の例外があり、これは非常に可能性があります。または、自分がやったことを実行して、元の例外をラップする例外をスローします。

7
hvgotcodes

HeadFirst Javaによると、tryブロックまたはcatchブロックにreturnステートメントがある場合でも、finallyブロックが実行されます。フローは最終的にジャンプし、戻って戻ります。

6
Aditi Garg

Finallyキーワードは、コードが実行されることを保証します。下の例では、closeステートメントは実行されません。上の例では、それらが実行されます(あなたが望むもの!)

3
Starkey

2番目のアプローチでは、メソッドから既に離れているため、 'close'ステートメントは実行されません。

1
nanda

すべてのエラーをキャッチした場合、違いはないはずです。そうでない場合、コード実行シーケンスは次のとおりであるため、finallyブロック内のコードのみが実行されます:finally code-> error throw-> code after catchコードブロックは期待どおりに機能します。

1
user7537910

これはリソースリークを回避する方法です

0
mtraut

Finallyブロックのコードは、catchブロックから例外が再スローされる前に呼び出されます。これにより、finallyブロックに入れたクリーンアップコードが呼び出されます。 finallyブロックの外側のコードは実行されません。

0
Doug Mulley

これにより明確になる可能性があります: http://www.Java2s.com/Code/Java/Language-Basics/Finallyisalwaysexecuted.htm

0
rompetroll

http://docs.Oracle.com/javase/tutorial/essential/exceptions/finally.html では、これは誤解を招きます(そして、疑問を生じさせた可能性があります):

The try block of the writeList method that you've been working with here opens a PrintWriter. The program should close that stream before exiting the writeList method. This poses a somewhat complicated problem because writeList's try block can exit in one of three ways.

1. The new FileWriter statement fails and throws an IOException.
2. The list.get(i) statement fails and throws an IndexOutOfBoundsException.
3. Everything succeeds and the try block exits normally.

4番目の方法IOExceptionおよびIndexOutOfBoundsException以外の例外がスローされます)がありません。前のページに示したコードは、finallyに頼る前に(1)と(2)のみをキャッチします。

私もJavaが初めてで、この記事を見つける前に同じ質問をしました。一般に、潜在記憶は理論よりも例にそれ自体を結びつける傾向があります。

0
Callistus

Finallyブロックは常に実行されるとは限りません。次のコードを考慮してください。

public class Tester {
    public static void main(String[] args) {
        try {
            System.out.println("The main method has run");
            System.exit(1);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("The finally block has run");
        }
    }
}

あなたの場合、このコードは明らかに例外をスローする可能性があるため、finallyブロック内のコードをtry/catchにラップすることをお勧めします。

    } catch (SQLException sqle) {
        sqle.printStackTrace();
    } finally {
     try {
        cs.close();
        rs.close();
     } catch (Exception e) {
      //handle new exception here
    }
0
nomadus

catchが呼び出しスタックの上位レベルの関数に例外をスローする可能性があることを考慮してください。これにより、例外を上位レベルにスローする前にfinalが呼び出されます。

0
Mahmoud Fayez