788

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

try {
    ...     
} catch (/* code to catch IllegalArgumentException, SecurityException, 
            IllegalAccessException, and NoSuchFieldException at the same time */) {
   someCode();
}

...代替:

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

有没有办法做到这一点?

4

10 回答 10

1252

从 Java 7开始,这已经成为可能。多捕获块的语法是:

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

但请记住,如果所有异常都属于同一个类层次结构,您可以简单地捕获该基本异常类型。

另请注意,如果直接或间接地ExceptionA从. 编译器会抱怨:ExceptionBExceptionBExceptionA

Alternatives in a multi-catch statement cannot be related by subclassing
  Alternative ExceptionB is a subclass of alternative ExceptionA

对此的修复是只在异常列表中包含祖先异常,因为它也会捕获后代类型的异常。

于 2010-08-16T18:11:12.373 回答
114

不完全是在 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);
  }

}



爪哇 7

try {
  //.....
} catch ( IllegalArgumentException | SecurityException |
         IllegalAccessException |NoSuchFieldException exc) {
  someCode();
}
于 2012-08-28T09:15:50.683 回答
26

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

catch (IllegalArgumentException | SecurityException e)
{
    ...
}
于 2010-08-16T18:12:44.397 回答
20

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

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

在更常见的情况下,如果 RepositoryException 是基类而 PathNotFoundException 是派生类,则:

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

上面的代码将捕获 RepositoryException 和 PathNotFoundException 以进行一种异常处理,并将所有其他异常集中在一起。从 Java 7 开始,根据上面@OscarRyz 的回答:

try { 
  ...
} catch( IOException | SQLException ex ) { 
  ...
}
于 2010-08-16T18:12:17.497 回答
19

不,在 Java 7 之前,每个客户一个。

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

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

但这可能不是最佳做法。只有当您有实际处理它的策略时,您才应该捕获异常 - 并且记录和重新抛出不是“处理它”。如果您没有纠正措施,最好将其添加到方法签名中,并让它冒泡给可以处理这种情况的人。

使用 JDK 7 及更高版本,您可以执行以下操作:

try {
    ...     
} catch (IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e) {
    someCode();
}
于 2010-08-16T18:09:02.247 回答
11

user454322 在Java 6(即Android)上的答案的更简洁(但不那么冗长,也许不是首选)替代方法是 catch all Exceptions and re-throw RuntimeExceptions。如果您计划在堆栈中进一步捕获其他类型的异常(除非您也重新抛出它们),这将不起作用,但会有效地捕获所有已检查的异常。

例如:

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

话虽这么说,为了冗长,最好设置一个布尔值或其他变量,并在此基础上在 try-catch 块之后执行一些代码。

于 2013-10-18T21:04:32.687 回答
4

在 pre-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.
  }
于 2015-02-16T18:08:04.453 回答
3

这很简单:

try { 
  // Your code here.
} catch (IllegalArgumentException | SecurityException | IllegalAccessException |
            NoSuchFieldException e) { 
  // Handle exception here.
}
于 2021-01-20T12:24:11.507 回答
1

对于 kotlin,目前还不可能,但他们已经考虑添加它:Source
但现在,只是一个小技巧:

try {
    // code
} catch(ex:Exception) {
    when(ex) {
        is SomeException,
        is AnotherException -> {
            // handle
        }
        else -> throw ex
    }
}
于 2019-09-17T19:48:08.403 回答
0

在异常层次结构中捕获恰好是父类的异常。这当然是不好的做法。在您的情况下,常见的父异常恰好是 Exception 类,并且捕获作为 Exception 实例的任何异常确实是不好的做法 - NullPointerException 之类的异常通常是编程错误,通常应该通过检查空值来解决。

于 2010-08-16T18:10:05.170 回答