exception種類 - try catch java用法




我可以在同一個catch子句中捕獲多個Java異常嗎? (6)

從Java 7開始,這是可能的。 try-catch塊的語法是:

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

在Java 7之前,這是不可能的。 但請記住,如果所有異常都屬於同一個類層次結構,則可以簡單地捕獲該基本異常類型。 唯一的另一種方法是捕捉它自己的catch塊中的每個異常。

編輯:請注意,在Java 7中,如果ExceptionB是從ExceptionA直接或間接繼承的,則無法在同一個塊中捕獲ExceptionA和ExceptionB。 編譯器會抱怨: The exception ExceptionB is already caught by the alternative ExceptionA

在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之前,但是,我會做這樣的事情:

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 6(也就是Android)上,user454322的答案可以替代清理程序(但不太詳細,也可能不是首選),可以捕獲所有Exception並重新拋出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塊之後的代碼執行一些代碼。


在Java 7中,您可以定義多個catch子句,如:

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

如果存在異常的層次結構,則可以使用基類來捕獲異常的所有子類。 在退化情況下,您可以通過以下方式捕獲所有 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 ) { 
  ...
}

捕獲碰巧是異常層次結構中的父類的異常。 這當然是不好的做法 。 在你的情況下,常見的父異常恰好是Exception類,並捕獲任何異常是Exception的實例,這實際上是不好的做法 - 類似於NullPointerException的異常通常是編程錯誤,通常應該通過檢查空值來解決。







try-catch