返回值棧,異常淹沒(méi)
- 當(dāng)Java程序的方法中有異常處理塊的時(shí)候多望,執(zhí)行引擎可能需要處理多了返回值嫩舟,這時(shí)候,執(zhí)行引擎會(huì)將處理到的返回值怀偷,壓入到返回值棧中家厌。
- 不建議在finally中進(jìn)行return,因?yàn)楫?dāng)有異常發(fā)生且catch塊中又拋出新的異常椎工,會(huì)淹沒(méi)異常饭于,這是非常糟糕的蜀踏。
/**
* Created by 編程只服JAVA on 2017.06.14.
*/
public class ExceptionTest {
public static void main(String[] args) {
System.out.println(testExc());
}
static int testExc(){
int a = 0;
try {
a = a/0;
return 1;
}catch (ArithmeticException e){
throw new IOException("就想拋出來(lái)");
}finally {
return 2;
}
}
}
運(yùn)行結(jié)果:
image.png
運(yùn)行結(jié)果分析:
- 異常果然被淹沒(méi)
- 返回值棧中,先壓入1掰吕,又壓入2果覆,因此最后返回值為2
異常棧追蹤,異常處理策略
- 當(dāng)一個(gè)方法中有異常發(fā)生后殖熟,JVM會(huì)先查看本方法中是否有該異常處理程序(即catch塊)局待,如果沒(méi)有,則會(huì)將異常沿著方法調(diào)用棧菱属,不斷向上拋钳榨,并且逐個(gè)尋找是否有處理該異常的程序,如果沒(méi)有纽门,則會(huì)最終拋到main方法薛耻,程序停止運(yùn)行。
/**
* Created by 編程只服JAVA on 2017.06.14.
*/
public class ExceptionTest {
public static void main(String[] args) throws IOException {
method1();
}
static void method1() throws IOException {
method2();
}
static void method2() throws IOException {
method3();
}
static void method3() throws IOException {
throw new IOException("method3's Exception");
}
}
運(yùn)行結(jié)果赏陵,注意觀察堆棧跟蹤:
image.png