web-dev-qa-db-ja.com

Javaで例外とスロー可能に関連付けられたオーバーヘッド

知っている

throw new Exception();

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

throw new Throwable();

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

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

public Session newSession() {  
  validate_user_and_password();   
}

userNotValidExceptionをスローすると、アナリストの観点からは正しく聞こえます。
_nullまたは0を返すことは、コードの抽象化が非常に優れている場合に正しく聞こえません。これを実際にコードで実装できるのか、それとも理論に任せる必要があるのか​​を知りたかっただけです。

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

注:本当にシンプルで馬鹿げた例を挙げましたが、これは私の場合ではありません。
注2:nullを返すのは普通のことですが、適切に抽象化してOO=コード、そして個人的には、これに害はありません。

27
WhyNotHugo

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

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

そのため、スタックトレースの作成に関するオーバーヘッドの観点では、ExceptionThrowableの間に違いはないはずです。

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

49
Asaph

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

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

これにより、スタックトレースを埋めない例外のインスタンスが作成され(例外を作成すると、fillInStackTraceに委任され、実際にスタックトレースが埋められます)、作成コストが安くなります。

37
akuhn

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

興味のある方は、「Efficient Javaジャストインタイムコンパイルでの例外処理」( link )と呼ばれる非常に興味深い論文があります。しかし、非常に有益です。

3
danben

Throwable vs. Exception

Java例外

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

1
YuanYe

投げたり、キャッチしたりしないでくださいThrowable.例外の範囲が大きすぎます。

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

1
gpampara

2つのクラスのソースコードを見て、 ExceptionThrowable と同じコンストラクターを公開する以外に何もしないことを確認できます。 =。すべての肉、したがってオーバーヘッドはThrowableにあります。

Exceptionが追加のオーバーヘッドを導入したとしても、代わりにThrowableを使用することは明らかに過剰に最適化されます。仕事に適したツールを使用します。軽量だからといって間違ったツールを採用しないでください。

1
dimo414

Throwableは、例外の親クラスです。そう Exception classThrowableから継承されます。

1
Muhammad

Java.lang.Exception拡張Java.lang.Throwableので、同じオーバーヘッドです。 Javadoc から:

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

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

0
mangoDrunk