在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^^
问候