一个扩展另一个类的类,如何将其作为异常类,?

时间:2012-10-02 18:44:19

标签: java exception inheritance

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

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

6 个答案:

答案 0 :(得分:3)

你必须将它包装在另一个类中。在java中,你只能抛出Throwable的子类型,这是一个类。

示例:

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

如果这是trampoline技术的应用或类似的控制流技术,那么可以获得堆栈跟踪(减少创建对象所需的时间) )。如果需要,我可以查一查。

答案 1 :(得分:2)

一个出路可能是使用泛型定义您的类以将Exception作为参数。通过这种方式,你可以让别人觉得在某种意义上这是例外。

public class One{}

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

PS注意:我已经假设您知道这是不可能的,因为您必须为此目的扩展Exception类

答案 2 :(得分:1)

如果您可以修改所扩展的课程,那么该课程应该延伸ExceptionRuntimeException

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

答案 3 :(得分:1)

Java允许单继承,因此您只能扩展Exception / Throwable或其他类。没有其他方法可以让类表现得像异常一样。当然,您仍然可以实现任意数量的接口。

话虽如此,你想抛出已经是其他类的子类的东西,这很奇怪。您是否尝试通过抛出异常并稍后捕获它来传输一些数据?使用异常控制程序流是一个很大的反模式。

答案 4 :(得分:0)

是的,就是这样,你只能抛出Throwable个班级。 Throwable是一个具体的类,而不是一个接口,所以你必须修改你的对象层次结构来实现你想要的。

答案 5 :(得分:0)

你必须扩展java.lang.Throwable才能抛出和实例。您可以直接或从任何非最终子类扩展它,通常是java.lang.RuntimeExceptionjava.lang.Exception

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