8

Exceptionを拡張するクラスに遭遇しました:

public class MyException extends Exception
{
    public MyException()
    {
        super();
    }

    public MyException(final String argMessage, final Throwable argCause)
    {
        super(argMessage, argCause);
    }

    public MyException(final String argMessage)
    {
        super(argMessage);
    }

    public MyException(final Throwable argCause)
    {
        super(argCause);
    }


}

すべてのオーバーライドコンストラクターがスーパークラスExceptionを呼び出しているだけなので、この方法で例外を拡張することは無意味ではありませんか?

4

3 に答える 3

10

いいえ、無意味ではありません。すべての場合に処理されるとは限らないcatch一般的な例外をキャッチするのではなく、この方法で特定の例外を処理して具体的に処理することができます。Exception

これにより、次のことができます。

try { 
  foo();
} catch (MyException e) {
  handleMyException(e);
}

一般的な処理方法がわからない場合は不可能ですが、より適切Exceptionに処理できMyExceptionます。

また、読みやすさも向上します。メソッドをthrows MyException(通常はより適切な名前で)宣言する方が適切throws Exceptionです。この方法で何がうまくいかないかがわかります。

于 2012-05-25T08:57:28.463 に答える
5

はい、理由があります。これにより、例外のタイプを区別できます。

次のコードを想定します。

try {
    // some instructions
} catch (MyFirstException firstException) {
    // Handler for the first exception
} catch (MySecondException secondException) {
    // Handler for the first exception
} catch (Exception exception) {
    // Handler for all other exceptions
}

イベントMyFirstExceptionMySecondExceptionException から継承し、すべてのメソッドをオーバーライドする場合、catch ブロックでそれらを区別できます。したがって、両方の例外に対して異なるハンドラーを使用できます。

于 2012-05-25T08:57:59.790 に答える
0

常に acatch (Exception e)を実行すると、実際には のすべてのサブクラスがキャッチされます。これは、通常はキャッチしたくない s にExceptionも特に当てはまります。RuntimeExceptionこれは、キャッチすることによってのみ悪化する可能性がありますThrowable

于 2012-05-25T09:00:19.087 に答える