3

如果我的类已经扩展了其他类,如果我想将我的类的实例作为 Exception 对象抛出,我该怎么办?

我发现的唯一方法是某些超类必须扩展 Exception 类。还有其他方法吗?编辑:这是否也表示设计缺陷,如果是,那么请解释在您的类中使用自定义异常的正确方法是什么,是通过在您的类中添加自定义异常的引用还是在您调用“新”时调用需要它,你能给出一个代码大纲吗?

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 注意:我已经假设您知道这是不可能的,因为您必须为此目的扩展 Exception 类

于 2012-10-02T18:57:20.863 回答
1

如果您可以修改您正在扩展的类,那么您应该让该类扩展ExceptionRuntimeException.

否则,您无法做到这一点。

于 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.RuntimeExceptionjava.lang.Exception.

您需要重新考虑围绕此约束进行设计。

于 2012-10-02T18:51:19.470 回答