3

Windowクラスのインスタンスを作成したとします。ウィンドウがユーザーに表示されます。次に、例外がスローされ、インスタンスへの参照が失われますが、インスタンスがまだ存在するため、ウィンドウは引き続きユーザーに表示されます (参照されなくなっただけです)。

これらの状況で何をすべきか?

具体的には、Squirrel スクリプト言語 (http://www.squirrel-lang.org/) について話しています。finallyJavaとは逆にブロックやファイナライザメソッドがないようなので、この言語では例外処理が壊れているのでしょうか?

4

1 に答える 1

0

私はリスを知りませんが、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 中にのみクリーンアップされるため、時間がかかる可能性があります。

于 2010-10-07T08:42:43.040 に答える