finally
ブロック内のストリームを閉じるようなクリーンアップ コードを配置する必要がある理由について、私は非常に混乱しています。
ブロック内のコードはfinally
何があっても (例外があるかどうかにかかわらず) 実行されることを読みました。finally
ブロックが実行された後、残りのメソッドが続行されます。
私の質問は、メソッドの残りの部分を続行する必要がある場合、関数内の try/catch ブロックの後にクリーンアップ コードを配置しないのはなぜですか?
finally
ブロック内のストリームを閉じるようなクリーンアップ コードを配置する必要がある理由について、私は非常に混乱しています。
ブロック内のコードはfinally
何があっても (例外があるかどうかにかかわらず) 実行されることを読みました。finally
ブロックが実行された後、残りのメソッドが続行されます。
私の質問は、メソッドの残りの部分を続行する必要がある場合、関数内の try/catch ブロックの後にクリーンアップ コードを配置しないのはなぜですか?
予期しない例外が発生した場合(キャッチおよび処理されない)。
キャッチされない例外がスローされた場合、finally ブロックは常に実行されますが、メソッド内の残りのコードはスキップされます。
したがって、finally ブロックの後にクリーンアップ コードを配置すると、例外が発生しても呼び出されません。
finally ブロックが実行された後、残りのメソッドが続行されます
これは、例外がキャッチされなかった場合にのみ当てはまります。try ブロック内で例外が発生した場合、catch ブロックが実行され (この例外用のブロックがある場合)、finally ブロックが実行され、catch ブロックがさらに例外をスローすると、メソッドの呼び出し元に制御が渡されます。 、このメソッドでさらにコードを実行する必要はありません。
編集:例外を食べるだけでなく、catch はもちろん返さなければならないことを明確にします。
発生したException
場合、つまり try ブロックが実行された場合は、finally
ブロックも実行されますのでご安心ください。メソッドの残りの部分が実行されるという信頼できない仮定を置く代わりに、これは単なる保護オプションです。
最後に、ブロックは 100% 確実に実行され、try/catch は完全に実行されるか、または実行されません。
したがって、システム リソースを解放したい場合は、finally ブロックにコードを記述します。メソッドのreturnステートメントも。
最終的に、コンパイラと同じくらい人々に適したブロックになります。
コンパイラだけでなく、コードを読む人間にも注意を払ってください。クリーンアップ部分が finally ブロックにある場合、コードを編集するのは非常に簡単です。
私の質問は; メソッドの残りの部分を続行する必要がある場合は、関数内の try/catch ブロックの後にクリーンなコードを配置してみませんか。
そうすることはできますが、閉じる必要があるオブジェクト参照 (Java 以外のリソース) を渡して、finally ブロックでこの関数を再度呼び出す必要があります。この関数が最終的にブロックされず、例外が発生した場合、Java 以外のリソースを閉じずにメソッド全体がスキップされるためです。
また、 java7 機能を使用することもできます ->リソースで try-catch。非 Java リソースは自動的に閉じられます。finally ブロックを使用する必要はありません。