27

知っている

throw new Exception();


完全なstackTraceなどを作成するため、かなり大きなオーバーヘッドがあります。

throw new Throwable();

同じ問題を提示しますか?この動作は継承されていますか、それとも、Throwable をスローするとオーバーヘッドが小さくなりますか?

EDITアナリストの観点から、間違ったパスワードを挿入するユーザーは、プログラムの通常の実行順序の例外です
。だから私が持っている場合:

public Session newSession() {  
  validate_user_and_password();   
}

アナリストの観点からは、UserNotValidException をスローすることは正しいように思えます。あなたのコードがかなり良い抽象化を持っている場合、
返すnullか、単に間違っているように聞こえます。0これを実際にコードで実装できるかどうか、または理論に任せる必要があるかどうかを知りたかっただけです。

プログラミング視点の例外とアナリスト視点の例外には大きな違いがあります。

注: 非常に単純でばかげた例を示しましたが、これは私の場合とは異なります。
注 2: 戻るnullのが普通のことであることはわかっていますが、適切に抽象化されたオブジェクト指向のコードが必要であり、個人的にはこれに害はないと思います。

4

8 に答える 8

49

Throwable作成時にスタックトレースも作成します。のJavaドキュメントからThrowable

throwable には、作成時のスレッドの実行スタックのスナップショットが含まれています。

したがって、スタックトレースの作成に関するオーバーヘッドに関しては、 と の間Exceptionに違いはないはずThrowableです。

「例外的なイベント」に例外を使用している場合 (そうあるべきです)、スタックトレースのオーバーヘッドをあまり気にする必要はありません。例外的なイベントは、実行中のコードでまれに発生します。したがって、例外は通常のコードのパフォーマンスに大きな影響を与えるべきではありません。

于 2010-01-25T01:11:41.133 に答える
37

いいえ、その影響を回避するには独自のサブクラスが必要です。

Exception ex = new Exception() {
    @Override public Throwable fillInStackTrace() {
        return this; // and do nothing else
    }
};

これにより、スタック トレースを埋めない例外のインスタンスが作成され (例外の作成はfillInStackTrace、スタック トレースを実際に埋めるために委譲されます)、したがって作成コストが低くなります。

于 2010-01-25T01:12:40.960 に答える
3

ExceptionJIT コンパイルでは、実際には、Java でをスローすることについて耳にしたことはまだ多くありません。ただし、スタック トレースも取得されるため、 a をスローしThrowableてもそれほど違いはありません。

興味のある方は、「Efficient Java exception handling in just-in-time compilation」(リンク)という非常に興味深い論文があります。軽い読み物ではありませんが、非常に有益です。

于 2010-01-25T01:13:01.223 に答える
1

スローしたりキャッチしたりしてはいけませんThrowable.。例外の範囲が広すぎます。

前述のように、例外は必要な場合にのみ使用する必要があります。つまり、例外的な状況で、それらを生成した状況に固有のものにする必要があります。それはさておき、 a をキャッチするThrowableことは、 などの多くの例外を意味しますOutOfMemoryException。この規模のエラーは (簡単に) 回復できないため、開発者が処理するべきではありません。

于 2010-01-25T06:12:36.947 に答える
1

ThrowableException の親クラスです。からException class継承されThrowableます。

于 2014-01-22T13:03:37.177 に答える
1

スロー可能と例外

Java 例外

@mangoDrunk が言ったように:「Throwable は例外とエラーのスーパークラスです。」

于 2015-05-12T07:31:22.307 に答える
0

java.lang.Exceptionextendsjava.lang.Throwableであるため、同じオーバーヘッドです。Javadocから:

Throwable クラスは、Java 言語のすべてのエラーと例外のスーパークラスです。このクラス (またはそのサブクラスの 1 つ) のインスタンスであるオブジェクトのみが、Java 仮想マシンによってスローされるか、Java の throw ステートメントによってスローされる可能性があります。同様に、このクラスまたはそのサブクラスの 1 つだけが catch 句の引数の型になることができます。

Error と Exception という 2 つのサブクラスのインスタンスは、通常、例外的な状況が発生したことを示すために使用されます。通常、これらのインスタンスは、関連情報 (スタック トレース データなど) を含めるために、例外的な状況のコンテキストで新たに作成されます。

于 2010-01-25T01:15:49.490 に答える