捕获多个异常 - 在捕获的异常上调用Exception中不存在的方法

use*_*353 5 java exception-handling exception catch-block

public class try
{
    public static void main(String[] args)
    {
        try
        {
            if(true)
                throw new A();
            if(true)
                throw new B();
        }
        catch( A | B e)
        {
            e.doit();
        }
    }
}

class A extends Exception
{
    public void doit() {}
}

class B extends Exception
{
    public void doit() {}
}
Run Code Online (Sandbox Code Playgroud)

这不编译

18: error: cannot find symbol
        e.doit();
         ^
symbol:   method doit()
location: variable e of type Exception
Run Code Online (Sandbox Code Playgroud)

变量e似乎最终是类型Exception而不是实际类型 - 这似乎是合乎逻辑的,因为在编译类型时编译器不知道将抛出什么类型.但是,有没有办法,使这项工作未做AB一些公共基类派生两者或实现一个共同的接口?

Jan*_*sch 4

嗯,不,因为 Java 不支持鸭子类型

对or进行instanceofand 转换显然是可行的,但在这种情况下您可能想要做的是以编写两个 catch 块的传统方式进行操作。eAB

我的意思是,这是有道理的,对吧?当您想要平等对待不同类型的异常时,多重捕获是合适的。在这种情况下,行为可能会截然不同(即使方法的名称相同)。