我能赶上同一个catch子句中的多个Java异常?我能赶上同一个catch子句中的多个Java异常?

2019-05-11 15:31发布

在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();
}

有没有办法做到这一点?

Answer 1:

做到这一点是因为Java 7中 。 用于多catch块的语法是:

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

但请记住,如果所有的异常属于同一类层次结构,你可以简单地赶上基本异常类型。

还要注意的是,你不能在同一块她俩都ExceptionA和ExceptionB如果ExceptionB是继承,直接或间接地从ExceptionA。 编译器会抱怨:

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


Answer 2:

不完全的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();
}


Answer 3:

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

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


Answer 4:

不,每个客户之一。

您可以搭乘超,像java.lang.Exception的,只要你走在任何情况下同样的动作。

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

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



Answer 5:

如果有异常的层次结构可以使用基类来捕捉异常的子类。 在退化的情况下,你可以捕获所有 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 ) { 
  ...
}


Answer 6:

一个清洁的(但更简洁,也许不是首选)替代user454322的Java 6的(即Android设备)的答案是捕获所有Exception S和重新抛出RuntimeException秒。 如果你在追赶其他类型的异常进一步向上堆栈(除非您还重新把它们)计划这是行不通的,但将有效地捕获所有检查的异常。

例如:

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块之后执行一些代码。



Answer 7:

在前期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.
  }


Answer 8:

抓住这恰好是在异常层次结构中的父类的例外。 这是当然,不好的做法的 。 在你的情况下,共同的父例外恰好是Exception类,并捕获任何异常是异常的情况下,确实是不好的做法 - 样的NullPointerException异常通常编程错误,并应通常通过检查空值来解决。



Answer 9:

是。 下面是一个使用管道的方式(|)分离器,

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


文章来源: Can I catch multiple Java exceptions in the same catch clause?