finally塊中不允許使用return,continue或break的原因
一個try塊可以不執行finally子句就能夠退出的唯一方法是通過調用System.exit()方法來實現的。
如果控制因為一個return,continue或break指令離開這個try塊,那么finally塊會在控制轉移到它的新的目標代碼之前執行.
也就是說如果在finally塊中使用return,continue或break,則會把拋出的異常吃掉。
同理:如果在finally塊中使用throw或代碼有問題拋出異常,也會吃掉原始的異常,不過因為此時能夠拋出新的異常,可以跟蹤,也就不是問題了。
package test;
public class TryTest {
public static void main(String[] args) {
try {
TryTest tryTest = new TryTest();
System.out.println(tryTest.test());
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean test() throws Exception {
try {
throw new Exception("Something error");// 1.拋出異常
} catch (Exception e) {// 2.捕獲的異常匹配(聲明類或其父類),進入控制塊
throw e;// 3. throw前控制轉移到finally塊,執行完后再返回
} finally {
return true;// 4. 控制轉移,直接返回,不再返回catch塊,吃掉了異常
}
}
}
打印結果為true,main方法捕獲不到異常。
本文章轉載于http://blog.javaresearch.org/page/zhouxianli