有什么办法在java中抛出多个异常?在Java中抛出多个异常
回答
不,没有没有办法,你可以这样做:
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)
}
投掷超过一个例外是没有意义的,因为你不能有超过一个错误(错误则有多种原因,但在任何时候都不会有多于一个的错误)。
如果您需要保留的原因轨迹,您可以链接例外:
} catch (Exception ex) {
throw new RuntimeException("Exc while trying ...", ex);
}
通过getCause()
这些都可以。
请不要鼓励人们赶上“异常”基础。另外,对于重新打包异常,我是一个项目特定的异常基类。通过这种方式,我可以区分可接受的例外情况,我已经包装和计划的例外情况以及意外的例外情况。 – unholysampler 2010-05-26 11:52:36
@unholysampler:同意。 – 2010-05-26 12:45:56
你可能有抛出多个不同的例外。例如:
if (obj == null)
throw new NullPointerException();
if (some other case)
throw new IllegalArgumentException();
if (this == this)
throw new IOException();
此代码可能会抛出多个不同的异常,但这不会同时发生。
我想你可以创建一个包含捕获的异常的列表中的异常,并抛出该异常,例如:
class AggregateException extends Exception {
List<Exception> basket;
}
一种方法,可以抛出一些例外的之一。例如:
public void dosomething() throws IOException, AWTException {
// ....
}
这标志着该方法能最终抛出这两个异常(以及任何的unchecked异常)的一个。你不能(用Java或任何语言AFAIK)同时抛出两个异常,这没有多大意义。
您还可以抛出一个嵌套异常,其中包含另一个异常对象。但这很难算作“抛出两个异常”,它只是表示由两个异常对象(经常来自不同层)描述的单个异常情况。
非常有帮助,最佳答案 – 2017-04-09 20:26:53
我见过一个模式,其中一个自定义异常内部存储其他异常(不记得了,为什么他们做到了),但它是这样的:
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
}
后面的代码中,容器异常被评估并转储到日志文件。
无论何时您处理用户提供的文件的服务器端编译并希望报告错误,Andreas_D描述的模式都非常有用。
例如,如果资源编译失败,可能会产生CompilationException。编译可能意味着任何数量的东西。例如,您可以评估最终用户上传文件的文本,解析出令牌,检查语法错误并确定文件是否有效。最后,这个东西要么是有效的,要么是无效的,你想要回传一个合适的CompilationException来传播备份调用堆栈。
像Andreas所描述的,你可以有一个add()方法,它可以让你将编译问题添加到你的异常中。这些问题本身不必是例外情况,但这取决于您。通常有助于坚持一个异常框架,以便您可以在多个地方使用相同的验证逻辑。
无论如何,你想要的是一个CompilationException通过调用堆栈回退,因为它告诉框架该东西没有编译。如果链上的任何人想知道为什么,那么他们可以通过调用getCauses()来获得潜在的问题。
从UI的角度来看,它也很有用。在重新接通电缆之前,可以正确处理在Exception上附加的信息,以便您可以向最终用户提供关于编译失败原因的一些信息。
有一种方法可以抛出多重豁免,但不是一次。例如当编译由于某种原因失败时,你的方法只能抛出一个异常。 如果你必须覆盖不同的机会,你可能会声明方法抛出所有异常的父类“Exception”。 所以,如果你声明了一个抛出异常的方法,这种方法可以引发任何类型的异常。
例如:
public static void main(String[] args) throws Exception
{
getClipboard(); // throws an UnsupportedFlavorException
initIOActivity(); // throw an IOException
}
我不知道你真正需要知道,但也许这会有所帮助。 虽然它,因为你的职位^^
问候
如果你想抛出多个异常,你应该真的把方法定义为'public void method()抛出UnsupportedSomethingException,IOException {...}'。使用'Exception'本身是一种快速消除正确处理异常所带来的强大功能的方法。我只会建议在UI线程或某个顶层捕捉异常,以避免完全崩溃。 – indivisible 2014-06-21 19:05:48
要扔在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的类的预定方法,其将指定的例外,以提供此异常被抑制了异常。
我不确定您是否询问是否可以一次抛出多个异常,或者我们可以让代码一次处理多个异常。我会尽力回答这两个问题。这是我在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.
...
}
我相信这会解决你的疑问。 这是我第一次回答,欢迎所有建议!
- 1. 在Java中抛出异常
- 2. resultset.last()在java中抛出一个异常
- 3. 在JavaScript中抛出多个异常
- 4. 在java 8流foreach中抛出异常
- 5. 在Java中抛出简单的异常
- 6. Java:可以抛出异常抛出异常吗?
- 7. ReplaceAll java抛出异常
- 8. Java抛出与SortedSet异常
- 9. java抛出异常java.lang.IndexOutOfBoundsException:
- 10. Java:抛出自身异常(?)
- 11. java:类抛出异常
- 12. java抛出检查异常?
- 13. Java不抛出异常
- 14. Java:异常抛出类?
- 15. 在多次抛出中重用'异常'
- 16. 魔术异常抛出抛出异常
- 17. 从异常类中抛出异常在java中
- 18. Java applet在处理mouseReleased事件时会抛出多个异常
- 19. 抛出一个新的异常抛出一个旧的异常
- 20. 在C++中抛出异常异常
- 21. 如何在java中捕捉异常抛出的异常?
- 22. 在Java中抛出异常昂贵的异常?
- 23. 通过多个进程抛出异常
- 24. 在pimcore中抛出异常
- 25. Java在stringinput上抛出异常
- 26. Java中抛出的大量异常
- 27. java中的Exc方法抛出异常
- 28. Java中的捕捉与抛出异常
- 29. Java中的类抛出异常
- 30. 'System.ServiceModel.Diagnostics.TraceUtility'在WCF中抛出一个异常
目前还不清楚OP是否要求“抛出多个”异常或“同时抛出多个异常” – 2014-10-14 06:57:09