知っている
throw new Exception();
完全なstackTraceなどを作成するため、かなり大きなオーバーヘッドがあります。
する
throw new Throwable();
同じ問題が発生しますか?この動作は継承されますか、またはThrowableをスローするとオーバーヘッドが小さくなりますか?
[〜#〜] edit [〜#〜]
アナリストの観点からすると、ユーザーが間違ったパスワードを挿入することは、プログラムの通常の実行順序の例外です。だから私が持っている場合:
public Session newSession() {
validate_user_and_password();
}
userNotValidExceptionをスローすると、アナリストの観点からは正しく聞こえます。
_null
または0
を返すことは、コードの抽象化が非常に優れている場合に正しく聞こえません。これを実際にコードで実装できるのか、それとも理論に任せる必要があるのかを知りたかっただけです。
プログラミングの視点の例外とアナリストの視点の例外には大きな違いがあります。
注:本当にシンプルで馬鹿げた例を挙げましたが、これは私の場合ではありません。
注2:null
を返すのは普通のことですが、適切に抽象化してOO=コード、そして個人的には、これに害はありません。
Throwable
は、作成時にスタックトレースも作成します。 Throwable
のJavaドキュメント から:
throwableには、作成時のスレッドの実行スタックのスナップショットが含まれています。
そのため、スタックトレースの作成に関するオーバーヘッドの観点では、Exception
とThrowable
の間に違いはないはずです。
「例外イベント」に例外を使用している場合(必要に応じて)、スタックトレースのオーバーヘッドをあまり気にしないでください。コードの実行中に例外的なイベントが発生することはほとんどありません。そのため、例外が通常のコードのパフォーマンスに重大な影響を与えることはありません。
いいえ、その影響を回避するには独自のサブクラスが必要です。
Exception ex = new Exception() {
@Override public Throwable fillInStackTrace() {
return this; // and do nothing else
}
};
これにより、スタックトレースを埋めない例外のインスタンスが作成され(例外を作成すると、fillInStackTrace
に委任され、実際にスタックトレースが埋められます)、作成コストが安くなります。
JITコンパイルでは、JavaでException
をスローすることについて多くの耳前がまだあるわけではありません。ただし、Throwable
をスローしても、スタックトレースが取得されるため、それほど違いはありません。
興味のある方は、「Efficient Javaジャストインタイムコンパイルでの例外処理」( link )と呼ばれる非常に興味深い論文があります。しかし、非常に有益です。
@mangoDrunkが言ったように:「Throwableは例外とエラーのスーパークラスです。」
投げたり、キャッチしたりしないでくださいThrowable.
例外の範囲が大きすぎます。
前述のように、例外は、必要な場合にのみ使用する必要があります。つまり、例外的な状況で、例外が発生した状況に固有である必要があります。それはさておき、Throwable
をキャッチすることは、OutOfMemoryException
などの例外のホストを意味します。この規模のエラーは(簡単に)回復できないため、開発者が処理することはできません。
Throwable
は、例外の親クラスです。そう Exception class
はThrowable
から継承されます。
Java.lang.Exception
拡張Java.lang.Throwable
ので、同じオーバーヘッドです。 Javadoc から:
Throwableクラスは、Java言語のすべてのエラーと例外のスーパークラスです。このクラス(またはそのサブクラスの1つ)のインスタンスであるオブジェクトのみがJava仮想マシン、またはJava throwステートメントによってスローできます。同様に、このクラスまたはそのサブクラスの1つだけがcatch節の引数タイプになります。
ErrorとExceptionの2つのサブクラスのインスタンスは、例外的な状況が発生したことを示すために従来から使用されています。通常、これらのインスタンスは、関連情報(スタックトレースデータなど)を含めるために、例外的な状況のコンテキストで新たに作成されます。