在Java中抛出多个exception

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

我想你可以创建一个包含已捕获exception列表的exception并抛出该exception,例如:

class AggregateException extends Exception { List basket; } 

不,你无法做到这样的事情:

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

如果这就是你要求的。

但是,您可以使用cause-constructor执行以下操作:

 try { throw new IllegalArgumentException(new NullPointerException()); } catch (IllegalArgumentException iae) { // handle illegal argument... throw iae.getCause(); // throws the cause (the NullPointerException) } 

方法可以抛出几个exception中的一个 。 例如:

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

这表明该方法最终可以抛出这两个exception中的一个(以及任何未经检查的exception)。 你不能(用Java或任何语言AFAIK)同时抛出两个例外,这没有多大意义。

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

抛出多个exception是没有意义的,因为您不能有多个错误(错误可能有多个原因,但任何时候都不会有多个错误)。

如果您需要跟踪原因,可以链接exception:

 } catch (Exception ex) { throw new RuntimeException("Exc while trying ...", ex); } 

这些可以通过getCause()

我见过一个模式,其中一个自定义exception在内部存储其他exception(不记得,为什么他们这样做了),但它就像:

 public class ContainerException extends Exception { private List innerExeptions = new Arrayist(); // some constructors public void add(Exception e) { innerExceptions.add(e); } public Collection getExceptions() { return innerExceptions; } } 

它像这样使用:

 try { // something } catch (ContainerException ce) { ce.add(new RunTimeException("some Message"); throw ce; // or do something else } 

稍后在代码中,评估容器exception并将其转储到日志文件中。

您可以抛出多个不同的exception。 例如:

 if (obj == null) throw new NullPointerException(); if (some other case) throw new IllegalArgumentException(); if (this == this) throw new IOException(); 

此代码可能会抛出多个不同的exception,但这可能永远不会同时发生。

每当您处理用户提供的文件的服务器端编译并想要报告错误时,Andreas_D描述的模式绝对有用。

例如,如果资源编译失败,您可能会生成CompilationException。 编译可能意味着任何数量的事情。 例如,您可以评估最终用户上载的文件内的文本,解析标记,检查语法错误并确定文件是否有效。 最后,该东西要么有效,要么无效,并且您希望返回适当的CompilationException以传播备份调用堆栈。

与Andreas描述的一样,您可以使用add()方法,以便将编译问题添加到exception中。 这些问题本身并不一定是例外,但这取决于你。 通常有助于坚持单个exception框架,以便您可以在多个位置使用相同的validation逻辑。

无论如何,你想要的是一个CompilationException通过调用堆栈回退,因为它告诉框架该东西没有编译。 如果链上的任何人想要知道原因,那么他们可以通过调用getCauses()来解决潜在的问题。

从UI的角度来看,它也很有用。 在返回线路之前,可以正确处理关于Exception的信息,以便您可以向最终用户提供有关编译失败原因的一些信息。

要在Java中抛出多个exception,首先必须将每个exception压缩为一个自定义exception,然后抛出相同的自定义exception。 请检查以下代码段以实现相同的目标。

  public class AggregateException extends Exception { public void addException(Exception ex){ addSuppressed(ex); exception = true; } } public class AnyClass{ public AggregateException aggExcep = new AggregateException(); public void whereExceptionOccurs(){ try{ //some code }catch(Exception e){ aggExcep.addException(e); //throw aggExcep; } } } 

在任何地方使用相同的引用aggExcep调用方法addException(显然在catch块内)抑制任何exception。 并且最后使用’throw’关键字显式地抛出aggExcep,无论你想要什么。

void addSuppressed(Throwable exception)

是Throwable类的预定义方法,它将指定的exception附加到为了传递此exception而被抑制的exception。

我不确定你是否在询问是否可以一次抛出多个exception,或者我们可以有一个代码来一次处理多个exception。 我会尝试回答这两个问题。 这是我在StackOverflow上的第一个答案,所以请原谅任何错误。

1)如果你想一次抛出多个exception,我想你不能这样做。 考虑一个类似的情况。 当你解决数学问题并达到除以0的点时,在这个时间点只有一个错误,它除以零。 所以我猜你可以为给定的语句抛出一个错误。 但是,在try catch块中可能存在许多语句,每个语句都可能引发不同的错误。

2)如果你想处理/捕获多个错误,有两种方法可以做到这一点。 i)在Java 7之前:

 `try{ ... //some method/action that can be a cause of multiple errors,say X and Y ... }catch(XException e){ //Do something if exception X arises. }catch(YException e){ //Do something if exception Y arises. } ` 

ii)在Java 7之后,您具有多捕获function。

 try{ ... //some method/action that can be a cause of multiple errors,say X and Y ... }catch(XException|YException e){ // Take action appropriate to both types of exception. ... } 

我相信这会解决你的疑问。 这是我的第一个答案,欢迎所有建议!

有一种方法可以抛出多个exeptions,但不是一次。 例如,当编译由于某种原因失败时,您的方法只能抛出一个exception。 如果你必须涵盖不同的机会,你可以声明你抛出所有exception“exception”的父类的方法。 因此,如果您声明一个方法通常抛出exception,则此方法可以抛出任何类型的exception。

例如:

 public static void main(String[] args) throws Exception { getClipboard(); // throws an UnsupportedFlavorException initIOActivity(); // throw an IOException } 

我不知道你真正需要知道什么,但也许这有帮助。 虽然它已经过了很多时间,因为你的post^^

问候