9

ほとんどの場合、カスタム例外クラスを作成する目的は何ですか。たとえば、NullPointerException

class NullPointerException extends RuntimeException {
      private static final long serialVersionUID = 5162710183389028792L;


      public NullPointerException() {
          super();
      }


      public NullPointerException(String s) {
          super(s);
      }
}

これは、私が見て作成したほとんどの例外クラスの基本的なテンプレートです。

私が考えることができる1つの目的は、これらの例外を処理することですが、これは例外メッセージに基づくことはできませんか?ほとんどの場合、例外タイプごとに単一の処理コードを記述します。これには「例外」があることを私は知っています。

しかし、それ以上のものはありますか?これは、クラス名だけが変わるところで繰り返されませんか?

また、これよりもいくつかのコードを持つJDK例外クラスはありますか?

4

6 に答える 6

9

私はいくつかの理由を考えることができます:

  • 複数の例外クラスを使用すると、プログラマーはcatch句を具体的に指定して、気になる例外のみをキャッチし、何をすべきかを知ることができます。
  • 例外クラスは、例外の原因となったエラーに関する情報を運ぶことができます。たとえばArrayIndexOutOfBoundsException、問題のある配列インデックスを伝達し、SQL例外はデータベース固有のエラーコードとメッセージを伝達する傾向があります。
  • 例外仕様(例外クラスをリストする)を使用して、コンパイル時に正確性をチェックできます。
于 2013-03-19T06:52:43.977 に答える
2

簡単に言えば、特別な例外クラスが必要ない場合は、作成しないでください。もしそうなら、あなたはそれを作ります。本当に魔法はありません。

ライブラリを作成している場合は、もちろん、ライブラリを使用している開発者の観点から考える必要があります (それがあなただけであっても): あなたのライブラリは特定の理由例外をスローしますか?ライブラリのユーザーはおそらくそれを望んでいますか?それらは現実的に何かを行うことができるため、具体的にこれらをキャッチします(ログを記録するだけでは十分ではありません、IMO)。

標準例外クラスの例: メソッドの呼び出し元は、他の例外を正常に伝播させながら、戻り値に変換IndexOutOfBoundsExceptionしたい場合があります。null

カスタム例外をデフォルトの方法で処理する場合は、IOException. 特定のことをしたいときに特定の IO 例外をキャッチできますが、特別な処理が必要ないときは他の例外と同じように処理できます (回復に役立つことは何もできません)。IOException

常に特定の catch ブロックを持つ必要がある、スーパークラスの catch によって決してキャッチされるべきではない完全にカスタムの例外がある場合は、Exception直接拡張します。

を拡張する必要があることはかなりまれだと思います。RuntimeException例外がキャッチされることを意図している場合はサブクラスにする必要があり、プログラムを終了するかログ出力を生成することを意図している場合は、カスタムメッセージ文字列をException使用してデフォルトの実装でカバーする必要があるためです。RuntimeException.

于 2013-03-19T07:39:50.333 に答える
1
  1. rootCauseOfException()、description()、solution()、suggestions() などのクライアントを支援する Exception クラスにさらにいくつかのメソッドを自由に追加できます。以下のリンクを参照できます:
    https://stackoverflow.com/a /22698673

  2. プロジェクトに相互依存モジュールがある場合は、同じ依存関係階層でも例外階層を維持できるため、基本レイヤーで単一の例外をキャッチすると、相互依存モジュールのすべての例外がキャッチされます。

  3. クライアント側に送信する前に、IP、ポートなどの機密データをマスクすることもできます。カスタム例外が使用されていない場合、一部の機密データが slient に漏洩する可能性があります。

  4. 理解しにくい場合がある Java の例外メッセージではなく、クライアントが簡単に理解できる独自の例外メッセージを提供できます。

于 2016-10-10T17:33:12.163 に答える
1

コードのどの部分でどのような正確な例外が発生したかをクライアント コードに認識させる必要があります。そのため、例外をセマンティックにし、他のコード ブロックと区別する必要があります。

これを行う方法:

  1. 新しい例外クラスを定義して、クラス名が何が起こるかを伝える
  2. codemessageまたはその他の情報をラップする統合/汎用例外クラスを定義します。code缶は何が起こるかを示します。

要約すると、例外に何らかの意味/セマンティクスを持たせ、クライアントに正確に何が起こるかを知らせます。

于 2013-03-19T08:14:11.660 に答える
0

基本的には、さまざまな例外をさまざまな方法で処理することです。たとえば、ArrayIndexOutOfBoundsExceptionに対してNumberFormatExceptionとは異なる操作を実行したい場合があります。

またはより明確に

}catch (ArrayIndexOutOfBoundsException ex){
//operation 1
}catch (NumberFormatException ex){
//operation 2
}
于 2013-03-19T06:51:47.840 に答える
0

主な目的は、カスタム/アプリ固有のエラーを特定することです。そこにいくつかの追加のメソッドを提供することもできます。たとえば、カスタム メッセージを返し、スタック トレースから原因と場所を抽出するカスタム例外があります。

于 2013-03-19T06:53:36.757 に答える