在 Java 中引发多个异常

2022-09-01 02:14:17

有没有办法在java中抛出多个异常?


答案 1

方法可以引发几个异常之一。例如:

 public void dosomething() throws IOException, AWTException {
      // ....
 }

这表示该方法最终可能会引发这两异常之一(以及任何未经检查的异常)。你不能(在Java或任何语言的AFAIK中)同时抛出两个异常,这没有多大意义。

还可以抛出嵌套 Exception,该 Exception 包含在另一个异常对象中。但这很难算作“抛出两个异常”,它只是表示由两个异常对象(通常来自不同层)描述的单个异常情况。


答案 2

不能引发两个异常。也就是说,你不能做这样的事情:

try {
    throw new IllegalArgumentException(), new NullPointerException();
} catch (IllegalArgumentException iae) {
    // ...
} catch (NullPointerException npe) {
    // ...
}

备选方案 1:异常 A 是由异常 B 引起的

您可以使用原因构造函数嵌套异常以执行以下操作:

try {
    Exception ex1 = new NullPointerException();

    // Throw an IllegalArgumentException that "wraps" ex1
    throw new IllegalArgumentException(ex1);
} catch (IllegalArgumentException iae) {
    // handle illegal argument...
    throw iae.getCause(); // throws the cause (the NullPointerException)
}

关于链式异常的好文章:编程。指南:链式异常

备选方案 2:使用禁止显示的异常

一个异常可以禁止显示另一个异常。

try {
    Exception ex1 = new NullPointerException();

    // Throw an IllegalArgumentException that "suppresses" ex1
    IllegalArgumentException ex2 = new IllegalArgumentException();
    ex2.addSuppressed(ex1);
    throw ex2;
} catch (IllegalArgumentException iae) {
    // handle illegal argument...
    ... iae.getSuppressed() ... // get hold of the suppressed exceptions
}

有关已抑制异常的好文章:编程。指南:已抑制的异常