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的異常通常是編程錯誤,通常應該通過檢查空值來解決。