2010-05-26 149 views
14

有什么办法在java中抛出多个异常?在Java中抛出多个异常

+2

目前还不清楚OP是否要求“抛出多个”异常或“同时抛出多个异常” – 2014-10-14 06:57:09

回答

14

不,没有没有办法,你可以这样做:

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) 
} 
6

投掷超过一个例外是没有意义的,因为你不能有超过一个错误(错误则有多种原因,但在任何时候都不会有多于一个的错误)。

如果您需要保留的原因轨迹,您可以链接例外:

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

通过getCause()这些都可以。

+6

请不要鼓励人们赶上“异常”基础。另外,对于重新打包异常,我是一个项目特定的异常基类。通过这种方式,我可以区分可接受的例外情况,我已经包装和计划的例外情况以及意外的例外情况。 – unholysampler 2010-05-26 11:52:36

+1

@unholysampler:同意。 – 2010-05-26 12:45:56

3

你可能有抛出多个不同的例外。例如:

if (obj == null) 
    throw new NullPointerException(); 

if (some other case) 
    throw new IllegalArgumentException(); 

if (this == this) 
    throw new IOException(); 

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

19

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

class AggregateException extends Exception { 
    List<Exception> basket; 
} 
11

一种方法,可以抛出一些例外的之一。例如:

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

这标志着该方法能最终抛出这两个异常(以及任何的unchecked异常)的一个。你不能(用Java或任何语言AFAIK)同时抛出两个异常,这没有多大意义。

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

+0

非常有帮助,最佳答案 – 2017-04-09 20:26:53

5

我见过一个模式,其中一个自定义异常内部存储其他异常(不记得了,为什么他们做到了),但它是这样的:

public class ContainerException extends Exception { 

    private List<Exception> innerExeptions = new Arrayist<Exception>(); 

    // some constructors 

    public void add(Exception e) { 
    innerExceptions.add(e); 
    } 

    public Collection<Exception> getExceptions() { 
    return innerExceptions; 
    } 
} 

,它使用这样的:

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

后面的代码中,容器异常被评估并转储到日志文件。

3

无论何时您处理用户提供的文件的服务器端编译并希望报告错误,Andreas_D描述的模式都非常有用。

例如,如果资源编译失败,可能会产生CompilationException。编译可能意味着任何数量的东西。例如,您可以评估最终用户上传文件的文本,解析出令牌,检查语法错误并确定文件是否有效。最后,这个东西要么是有效的,要么是无效的,你想要回传一个合适的CompilationException来传播备份调用堆栈。

像Andreas所描述的,你可以有一个add()方法,它可以让你将编译问题添加到你的异常中。这些问题本身不必是例外情况,但这取决于您。通常有助于坚持一个异常框架,以便您可以在多个地方使用相同的验证逻辑。

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

从UI的角度来看,它也很有用。在重新接通电缆之前,可以正确处理在Exception上附加的信息,以便您可以向最终用户提供关于编译失败原因的一些信息。

0

有一种方法可以抛出多重豁免,但不是一次。例如当编译由于某种原因失败时,你的方法只能抛出一个异常。 如果你必须覆盖不同的机会,你可能会声明方法抛出所有异常的父类“Exception”。 所以,如果你声明了一个抛出异常的方法,这种方法可以引发任何类型的异常。

例如:

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

我不知道你真正需要知道,但也许这会有所帮助。 虽然它,因为你的职位^^

问候

+0

如果你想抛出多个异常,你应该真的把方法定义为'public void method()抛出UnsupportedSomethingException,IOException {...}'。使用'Exception'本身是一种快速消除正确处理异常所带来的强大功能的方法。我只会建议在UI线程或某个顶层捕捉异常,以避免完全崩溃。 – indivisible 2014-06-21 19:05:48

2

要扔在Java中多个异常传递了大量的时间,你首先必须每个异常压制成一个定制的异常,然后抛出相同的自定义异常。请检查下面的代码片段以实现相同。

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; 
     } 
    } 
} 

调用方法addException与相同的引用在任何你想要的地方(catch块明显)抑制任何异常。 并在最后明确地抛出使用'throw'关键字在任何你想要的地方。

空隙addSuppressed(Throwable异常)

是Throwable的类的预定方法,其将指定的例外,以提供此异常被抑制了异常。

0

我不确定您是否询问是否可以一次抛出多个异常,或者我们可以让代码一次处理多个异常。我会尽力回答这两个问题。这是我在StackOverflow上的第一个回答,所以请原谅所有错误。

1)如果你想一次抛出多个异常,我认为你不能这样做。考虑一个类似的情况。当你解决一个数学问题并达到一个被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后,你必须多捕捉功能。

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. 
    ... 
} 

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