如果我的类已经扩展了其他类,如果我想将我的类的实例作为 Exception 对象抛出,我该怎么办?
我发现的唯一方法是某些超类必须扩展 Exception 类。还有其他方法吗?编辑:这是否也表示设计缺陷,如果是,那么请解释在您的类中使用自定义异常的正确方法是什么,是通过在您的类中添加自定义异常的引用还是在您调用“新”时调用需要它,你能给出一个代码大纲吗?
如果我的类已经扩展了其他类,如果我想将我的类的实例作为 Exception 对象抛出,我该怎么办?
我发现的唯一方法是某些超类必须扩展 Exception 类。还有其他方法吗?编辑:这是否也表示设计缺陷,如果是,那么请解释在您的类中使用自定义异常的正确方法是什么,是通过在您的类中添加自定义异常的引用还是在您调用“新”时调用需要它,你能给出一个代码大纲吗?
您将不得不将它包装在另一个类中。在java中你只能抛出Throwable的子类型,它是一个类。
例子:
public class Wrapper extends Exception {
public final MyClass wrapped;
public Wrapper(MyClass toWrap) { wrapped = toWrap; }
}
如果这是蹦床技术或类似控制流技术的应用,那么有一些方法可以不获取堆栈跟踪(减少创建对象所需的时间)。有需要我可以查一下。
出路可能是使用泛型定义您的类以将异常作为参数。这样你就可以让别人觉得在某种意义上这是个例外。
public class One{}
public class Two<E extends Exception> extends One {
E e = null;
public void throwE() throws E {
throw e;
}
}
PS 注意:我已经假设您知道这是不可能的,因为您必须为此目的扩展 Exception 类
如果您可以修改您正在扩展的类,那么您应该让该类扩展Exception
或RuntimeException
.
否则,您无法做到这一点。
Java 允许单一继承,因此您可以只扩展Exception
/Throwable
或其他类。没有其他方法可以让类表现得像异常。当然,您仍然可以实现任意数量的接口。
话虽这么说,你想抛出已经是其他类的子类的东西是很奇怪的。您是否试图通过抛出异常并稍后捕获它来通过层传输一些数据?使用异常控制程序流是一个很大的反模式。
是的,就是这样,你只能抛出Throwable
类。Throwable
是一个具体的类,而不是一个接口,所以你必须修改你的对象层次结构来实现你想要的。
您必须扩展java.lang.Throwable
才能抛出和实例化。您可以直接扩展它,也可以从它的任何非最终子类(通常是java.lang.RuntimeException
或java.lang.Exception
.
您需要重新考虑围绕此约束进行设计。