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方法捕獲不到異常。