私はリスを知りませんが、finally ブロックがない場合でも、Java 内である程度動作をシミュレートできます。
Exception error = null;
try {
// do something
}
catch (Exception e) {
error = e;
}
// My finally code goes here
// ...
if (error != null) {
// Oh dear clean up all my resources - files, windows, sockets etc.
throw error;
}
そのため、catch ブロックは例外を変数に格納し、再スローしたい場合に後でテストできるようにし、他のクリーンアップを実行する機会を引き続き提供します。明らかに、注意しなければならないニュアンスがあります (たとえば、特別な処理が必要な明示的な種類の例外、try / catch の外でより多くの例外がスローされる) が、慎重に検討すれば大丈夫です。
特に、システム リソース (グラフィック ハンドル、ソケット、ウィンドウ、ファイル ハンドルなど) は、Java やその他のガベージ コレクション言語では少し乱雑になる傾向があります。通常、これらのリソースは明示的な close() メソッドを持つクラスによって管理されます。したがって、物事がヒープに落ちていることがわかっている場合は、通常、オブジェクトに対して明示的な close() を呼び出して、すぐにそれらをクリーンアップします。そうしないと、オブジェクトはファイナライズ中にクリーンアップされますが、GC 中にのみクリーンアップされるため、時間がかかる可能性があります。