6

後で使用するために例外への参照を保持することは合理的ですか?それとも、例外への参照をスロー/キャッチの相互作用よりも大幅に長く保持することに関連する落とし穴がありますか?

たとえば、次のコードがあるとします。

class Thing {
  private MyException lastException = ...;
  synchronized void doSomethingOrReportProblem() {
    try {
      doSomething();
    } catch (MyException e) {
      if (seemsLikeADifferentProblem(e, lastException)) {
        reportProblem(e);
      }
      lastException = e;
    }
  }
}

私のプログラムが JVM と同じ寿命を持つ Thing を作成すると仮定すると、Thing が lastException への長引く参照を維持することに関連する正確性の問題はありますか? そして、これはJDK7でまったく変更されましたか? (OpenJDK7 の Throwable のソース コードを見ると、構築時に fillInStackTrace() を呼び出さずに Throwable を作成できる、JDK6 にはなかった新しい 4 つの引数のパブリック コンストラクターがあるようです。)

MyException の下のチェーンされた例外のいずれかにオブジェクトへの参照があった場合、はい、これにより、それらのオブジェクトがガベージ コレクションされるのを防ぐことができますが、それで問題ないと仮定すると、注意すべきトラップはありますか?

4

3 に答える 3

0

Throwableは本格的なJavaオブジェクトであり、誰かがそれを参照している限り存続します。Throwableに入ってからしばらく経ちましたが、スタックトレース内のメソッドのクラス以外の(おそらく)参照を保持している可能性があるものは何も考えられません。ただし、スタックトレース自体は、重要な量のストレージを消費します。

したがって、他の適度に大きなオブジェクトと実際には違いはありません。また、JVMの存続期間中、1つの例外を保持することは、まったく問題がないようには見えません。(すべての例外の記録を保持している場合、それは少し多いかもしれません。)

于 2012-11-14T20:04:06.927 に答える
0

基本的に、「バックエンドにネイティブコード/ストレージ」を備えたオブジェクトと同じように扱うことをお勧めします。いくつかの例外への参照を保持する必要がある場合、たとえば、特定のメソッドがどこから呼び出されたかを「覚えている」などの場合は、そうすることを恐れないでください。一方で、「状況を監視する」何らかの方法で構築せずに、それらの数十万を維持しないでください。

于 2012-11-14T19:28:04.330 に答える
0

例外への参照が直接のプログラム関連性を超えて保持される一般的なケースが 2 つあります。

  1. ロギング フレームワークに渡される場合
  2. コンテナ コンテキストから伝播される場合、通常は適切な形式に適応された後にリモート アプリケーションに返されます。
于 2012-11-14T22:37:11.963 に答える