如何显示父异常的 Catch 块也将处理子类

How to show that a Catch block for the Parent-exception will handle subclasses as well

我遇到过这个问题。

我创建了一个 class CatHandler,其中 3 内部 classes (ExceptionAlpha extends Exception, ExceptionBeta 延长 ExceptionAlpha, ExceptionGammer 延长 ExceptionBeta) .这三个exception subclasses都是空的;它们不包含代码。所有代码都应该写CatHandler.

现在的问题是在CatHandler中写一些代码来表明ExceptionBetaExceptionGammer会被ExceptionAlpha类型的catch块捕获?

对于输出,我们可以使用System.err.println()getMessage()printStackTrace()等合适的打印语句来显示exception subclass es 已成功捕获。

我想知道如何显示异常处理以这种方式发生?真是一头雾水。

public class CatHandler {

    class ExceptionAlpha extends Exception {

    }

    class ExceptionBeta extends ExceptionAlpha {

    }


    class ExceptionGammer extends ExceptionBeta {

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }
}

将每个异常中的 getMessage 改写为 return 不同的内容。多态性将允许 ExceptionAlpha 捕获它的子类,然后使用各自子类的特定实现。

the question is to write some code in CatHandler to show that ExceptionBeta and ExceptionGammer will be caught in the catch block of type ExceptionAlpha.

首先,您需要声明一些方法,这些方法将 throw ExceptionBetaExceptionGamma.

因为它们都是检查异常,所以你应该在方法声明中包含一个throws 子句

最好将所有嵌套的class定义为static,否则这些异常总是需要一个包含class(即CatHandler)的对象才能被实例化。

main() 中的代码调用不安全行为并使用 catch 块处理它,期望 ExceptionAlpha 或其子类型。

为了演示捕获异常的实际类型,我们可以从其[=20]中提取class名称 =] 对象或打印堆栈跟踪(class 名称 将在一开始提到堆栈跟踪)。两个选项如下所示。

public class CatHandler {

    public void m1() throws ExceptionBeta {
        throw new ExceptionBeta();
    }

    public void m2() throws ExceptionGamma {
        throw new ExceptionGamma();
    }

    public static class ExceptionAlpha extends Exception{}
    public static class ExceptionBeta extends ExceptionAlpha {}
    public static class ExceptionGamma extends ExceptionBeta {}

    public static void main(String[] args) {
        CatHandler catHandler = new CatHandler();
        try {
            catHandler.m1();
        } catch (ExceptionAlpha e) {
            System.out.println("Class name: " + e.getClass().getSimpleName());
            e.printStackTrace();
        }

        try {
            catHandler.m2();
        } catch (ExceptionAlpha e) {
            System.out.println("Class name: " + e.getClass().getSimpleName());
            e.printStackTrace();
        }
    }
}

输出

Class name: ExceptionBeta
Class name: ExceptionGamma

_ path _.CatHandler$ExceptionBeta
    at _ path _.CatHandler.m1(CatHandler.java:6)
    at _ path _.CatHandler.main(CatHandler.java:36)

_ path _.CatHandler$ExceptionGamma
    at _ path _.CatHandler.m2(CatHandler.java:10)
    at _ path _.CatHandler.main(CatHandler.java:42)