我可以在同一个catch子句中捕获多个Javaexception吗?

在Java中,我想要做这样的事情:

try { ... } catch (IllegalArgumentException, SecurityException, IllegalAccessException, NoSuchFieldException e) { someCode(); } 

…代替:

 try { ... } catch (IllegalArgumentException e) { someCode(); } catch (SecurityException e) { someCode(); } catch (IllegalAccessException e) { someCode(); } catch (NoSuchFieldException e) { someCode(); } 

有没有办法做到这一点?

这是可能的, 因为Java 7 。 try-catch块的语法是:

 try { ... } catch (IOException | SQLException ex) { ... } 

在Java 7之前,这是不可能的。 但请记住,如果所有exception属于同一个类层次结构,那么您可以简单地捕获该基本exceptiontypes。 唯一的另一种方法是捕捉每个exception在自己的catch块中。

编辑:请注意,在Java 7中,如果ExceptionB是从ExceptionA直接或间接inheritance的,则无法在同一个块中同时捕获ExceptionA和ExceptionB。 编译器会抱怨: The exception ExceptionB is already caught by the alternative ExceptionA

不是Java 7之前,但我会做这样的事情:

Java 6和之前

 try { //..... } catch (Exception exc) { if (exc instanceof IllegalArgumentException || exc instanceof SecurityException || exc instanceof IllegalAccessException || exc instanceof NoSuchFieldException ) { someCode(); } else if (exc instanceof RuntimeException) { throw (RuntimeException) exc; } else { throw new RuntimeException(exc); } } 

Java 7

 try { //..... } catch ( IllegalArgumentException | SecurityException | IllegalAccessException |NoSuchFieldException exc) { someCode(); } 

在Java 7中,您可以定义多个catch子句,如:

 catch (IllegalArgumentException | SecurityException e) { ... } 

不,每个客户一个。

只要您在所有情况下都采取相同的操作,就可以捕获超类,如java.lang.Exception。

 try { // some code } catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception e.printStackTrace(); } 

但这可能不是最好的做法。 当你有一个实际处理策略的时候,你应该只捕获一个exception,而logging和重新抛出不是“处理它”。 如果您没有纠正措施,最好将其添加到方法签名中,然后让其处理。

如果存在exception的层次结构,则可以使用基类来捕获exception的所有子类。 在退化情况下,您可以通过以下方式捕获所有 Javaexception:

 try { ... } catch (Exception e) { someCode(); } 

在更常见的情况下,如果RepositoryException是基类,并且PathNotFoundException是派生类,那么:

 try { ... } catch (RepositoryException re) { someCode(); } catch (Exception e) { someCode(); } 

上面的代码会捕获RepositoryException和PathNotFoundExceptionexception处理的一种,所有其他exception都集中在一起。 从Java 7开始,按照上面的@ OscarRyz的回答:

 try { ... } catch( IOException | SQLException ex ) { ... } 

在Java 6(也就是Android)上,user454322的答案可以替代清除器(但不是那么详细,也可能不是首选),而是捕获所有Exception并重新抛出RuntimeException 。 如果你打算在栈上进一步捕获其他types的exception(除非你也重新抛出exception),这将不起作用,但是会有效地捕获所有检查的exception。

例如:

 try { // CODE THAT THROWS EXCEPTION } catch (Exception e) { if (e instanceof RuntimeException) { // this exception was not expected, so re-throw it throw e; } else { // YOUR CODE FOR ALL CHECKED EXCEPTIONS } } 

这就是说,对于冗长,最好是设置一个布尔值或其他一些variables,并基于try-catch块后执行一些代码。

在前7如何:

  Boolean caught = true; Exception e; try { ... caught = false; } catch (TransformerException te) { e = te; } catch (SocketException se) { e = se; } catch (IOException ie) { e = ie; } if (caught) { someCode(); // You can reference Exception e here. } 

是的,你可以在Java 7中看到这个例子

 try { //your code } catch(SQLException | IOException ex) { } 

但是你需要记住一些多重捕获的规则,你可以在http://pictorialjava.blogspot.in/2015/11/exception-handling-in-java-7.html上find

Java SE 7及更高版本的多个catch语句可能如下所示。

 try{ // business logic.... } catch(IOException | SQLException ex){ // handle exception of both types... } 

请注意…

  1. 单个catch块可以处理多种types的exception。
  2. 这两个exception不应该是相同的types,即你不能在单个catch块中捕获IOException或SQLException的子类exception。

  3. 捕捉参数ex是明确的最后,你不能给它分配任何值。

  4. 所有exception都应该用垂直竖线(|)分隔。

捕获碰巧是exception层次结构中的父类的exception。 这当然是不好的做法 。 在你的情况下,常见的父exception恰好是Exception类,并且捕获任何exception是Exception的实例,这实际上是不好的做法 – 类似于NullPointerException的exception通常是编程错误,通常应该通过检查空值来解决。

 try { ... } catch (IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e) { //even you can check here like if(e instanceof IllegalArgumentException){ //like wise you can check the type of the exception, its just an info may not required } someCode(); } 

是的你可以…

catch(ArithmeticException | ArrayIndexOutOfBounds | RunTimeException | Exception ex){ex.printStackTrace(); }

你必须把更具体的例外..第一个子类,然后超类…