Java における例外とスロー可能に関連するオーバーヘッド
質問
知っている
throw new Exception();
完全な stackTrace などが作成されるため、かなり大きなオーバーヘッドが発生します。
する
throw new Throwable();
同じ問題が発生していますか?この動作は継承されているのでしょうか、それとも Throwable をスローする方がオーバーヘッドが小さい (いいえ) のでしょうか?
編集
から アナリスト 観点から見ると、ユーザーが間違ったパスワードを入力することは、プログラムの通常の実行順序の例外です。それで、私が持っている場合:
public Session newSession() {
validate_user_and_password();
}
UserNotValidException をスローすることは、正しく聞こえるでしょう。 アナリスト 視点。
戻る null
または 0
コードがかなり優れた抽象化を持っている場合は、正しくないと思われるだけです。これを実際にコードで実装できるかどうか、それとも理論に任せる必要があるのかを知りたかっただけです。
プログラミングの観点からの例外とアナリストの観点からの例外には大きな違いがあります。
注記:非常に単純でばかげた例を挙げましたが、これは私の場合にはまったく当てはまりません。
注2:戻ってくるのはわかっています null
これは普通のことですが、適切に抽象化された OO コードが必要です。個人的には、これに害はないと思います。
解決
Throwable
も、それが作成されていますスタックトレースを作成します。 Throwable
の javaのドキュメントから:
スロー可能オブジェクトが作成された時点で、そのスレッドの実行スタックのスナップショットが含まれています。
そこでスタックトレースを作成することに関してオーバーヘッドの点で、Exception
とThrowable
の間に差があってはならない。
、あなたはあまりにもスタックトレースのオーバーヘッドに関係してはなりません。例外イベントは、コードを実行するにはまれにしか発生しません。例外は、任意の重要な方法で通常のコードのパフォーマンスに影響を与えるべきではありませんので。
他のヒント
いいえ、あなたはその影響を避けるために、独自のサブクラスを必要とします。
Exception ex = new Exception() {
@Override public Throwable fillInStackTrace() {
return this; // and do nothing else
}
};
このは(実際には、スタックトレースを埋めるためにfillInStackTrace
に例外デリゲートの作成)スタックトレースを記入しないであろう例外のインスタンスを作成し、作成するために、安価なことである。
JIT コンパイルでは、実際には、 Exception
ジャワでは。しかし、投げる Throwable
ここでもスタックトレースが取得されるため、それほど違いはありません。
ご興味がございましたら、「ジャストインタイム コンパイルにおける効率的な Java 例外処理」という非常に興味深い論文があります (リンク)。軽い読み物ではありませんが、非常に有益です。
あなたは決して投げていないか、例外の適用範囲があまりにも素晴らしいですThrowable.
をキャッチする必要があります。
は、例外が必要な場合、すなわち、のみ使用してください。余談という、Throwable
をキャッチすることは、OutOfMemoryException
などの例外のホストを意味します。この大きさのエラーは、(容易)から回収することができず、現像剤によって処理されるべきではない。
Throwable
は例外の親クラスです。そうException class
はThrowable
から継承されます。
java.lang.Exception
は、java.lang.Throwable
を拡張します。 のJavadocするます:
Throwableクラスは、Java言語のすべてのエラーと例外のスーパークラスです。このクラス(またはそのサブクラスの1つ)のインスタンスであるオブジェクトだけがJava仮想マシンによってスローされるか、Javaのthrow構文によってスローされます。同様に、これだけのクラスまたはそのサブクラスの1つは、catch節での引数の型を指定できます。
2つのサブクラスのインスタンス、エラーや例外、従来は例外的な状況が発生したことを示すために使用されています。 (そのようなスタックトレースデータなど)関連情報を含むように、典型的には、これらのインスタンスは、新たに例外的な状況のコンテキストで作成されています。