3

クラスがすでに他のクラスを拡張している場合、クラスのインスタンスをExceptionオブジェクトとしてスローするにはどうすればよいですか?

私が見つけた唯一の方法は、いくつかのスーパークラスがExceptionクラスを拡張している必要があるということです。他に方法はありますか?編集:これは設計上の欠陥も示していますか?はいの場合、クラスでカスタム例外を使用する正しい方法を説明してください。クラスにカスタム例外の参照を追加するか、「new」を呼び出すことで、必要です、コードの概要を教えていただけますか?

4

6 に答える 6

3

別のクラスでラップする必要があります。Java では、クラスである Throwable のサブタイプのみをスローできます。

例:

public class Wrapper extends Exception {
    public final MyClass wrapped;
    public Wrapper(MyClass toWrap) { wrapped = toWrap; }
}

これがトランポリン手法または同様の制御フロー手法のアプリケーションである場合、スタック トレースを取得しない方法があります (オブジェクトの作成にかかる時間を短縮します)。必要に応じて調べることができます。

于 2012-10-02T18:49:54.683 に答える
2

抜け道は、ジェネリックを使用してクラスを定義し、例外をパラメーターとして受け取ることができます。このようにして、ある意味でこれは例外であると他の人に感じさせることができます.

public class One{}

public class Two<E extends Exception> extends One {
    E e = null;
    public void throwE() throws E {
        throw e;
    }
}

PS注:その目的のために例外クラスを拡張する必要があるため、それが不可能であることをすでに知っていると想定しています

于 2012-10-02T18:57:20.863 に答える
1

拡張しているクラスを変更できる場合は、そのクラスを拡張ExceptionまたはRuntimeException.

そうでなければ、これを行う方法はありません。

于 2012-10-02T18:45:56.893 に答える
1

Java では単一継承が許可されているため、Exception/Throwableまたは他のクラスのみを拡張できます。クラスが例外のように動作できるようにする方法は他にありません。もちろん、必要な数のインターフェイスを実装することもできます。

そうは言っても、すでに他のクラスをサブクラス化しているものをスローしたいのは非常に奇妙です。例外をスローして後でキャッチすることにより、レイヤーを介してデータを転送しようとしていますか? 例外を使用してプログラム フローを制御することは、大きな反パターンです。

于 2012-10-02T18:47:48.283 に答える
0

はい、それだけですThrowable。クラスをスローすることしかできません。Throwableインターフェイスではなく具象クラスであるため、目的を達成するにはオブジェクト階層を変更する必要があります。

于 2012-10-02T18:47:45.967 に答える
0

java.lang.Throwableスローしてインスタンス化できるように拡張する必要があります。直接、または非最終サブクラス (通常は または ) から拡張できjava.lang.RuntimeExceptionますjava.lang.Exception

この制約を回避する設計を再考する必要があります。

于 2012-10-02T18:51:19.470 に答える