java中的多catch语句

java中的多catch语句,java,exception,Java,Exception,我试图理解多catch语句在java中是如何工作的。在文档中,他们说不允许在catch语句中包含相关类型 这里我有一个小样本,我正在玩: class a extends Exception{} class b extends RuntimeException{} public class test{ public static void main(String[] args){ try { System.out.println(new a()

我试图理解多catch语句在java中是如何工作的。在文档中,他们说不允许在catch语句中包含相关类型

这里我有一个小样本,我正在玩:

class a extends Exception{}

class b extends RuntimeException{}

public class test{
    public static void main(String[] args){
        try {
            System.out.println(new a() instanceof Exception);
            System.out.println(new b() instanceof Exception);
            throw new a();
        }catch(a | b e) {
            System.out.println(e.getStackTrace());
        }
    }
}
这两个类都是异常的实例。首先,一个是显而易见的方式,第二个是从RuntimeException继承和RuntimeException继承异常

那么为什么要编译这段代码呢?异常a不应该也包括异常b
谢谢

通过
相关类型
我相信他们所指的关系是扩展(或子类)关系。因此,在您的情况下,您有:

Exception 
├── a
└── RuntimeException
    └── b
a是Exception的一个子类

b是RuntimeException的子类,RuntimeException是Exception的子类

a不是b的一个子类 b不是a的一个子类


因此,增强型捕捉块可以捕捉a和b

异常a不应该也包括异常b吗?
如果抛出了
b
a
如何捕捉到这一点?另一方面,您应该使用
a
B
Test
作为类名。我认为规范更具体一些:“如果类型的联合包含两个可选的
Di
Dj
(I≠ j) 其中,
Di
Dj
的子类型-因此没有关于拥有共同祖先的任何内容(因为所有异常都必须是Throwable的后代,所以不起作用):“异常参数类型的表示中使用的每个类类型必须是类
Throwable
Throwable
的子类)请遵循命名约定。类(例外情况a和b)应以大写字符开头。对于例外也以“例外”结尾。是的,凯尔。现在有道理了。