情况1: try{} catch(){} finally{} return;
有无异常程序都顺序执行,一定会执行到return 语句,有无异常都输出 15
//有无异常程序都顺序执行
public static void main(String[] args) {
System.out.println(val());
}
public static int val() {
int num = 5;
try {
num = num / 0;
} catch (Exception e) {
num = 10;
} finally {
num = 15;
}
return num;
}
情况2: try{ return; }catch(){} finally{} return;
【有异常】
- try里面的return语句 在出现异常之后,或者return语句出错,直接忽略try中的return语句,顺序执行try(执行到异常),catch,finally,finally后的return语句
- try里面的return语句 在出现异常之前,这编译报错,因为访问不到return之后的语句
【无异常】
- 会执行return语句,把return语句中的保存下来,执行finally块中的语句,finally之后的return不会执行,然后程序返回try块中的return,返回开始保存的值,finally改变的是当前方法的变量,返回的是保存的值,下例返回的是5
情况3: try{ } catch(){return;} finally{} return;
【有异常】
- 与情况2中无异常相同,返回保存的值,下例返回10,finally块之后的return不会执行
【无异常】
- 无异常肯定catch块不执行,程序顺序执行try finally ,finally之后,上例无异常返回15
情况4: try{ return; }catch(){} finally{return;}
【有异常】
- 程序顺序执行,try块(到异常),catch块,finally块,finally块有return,后面不能有return idea编译报错,因为根本执行不到,finally覆盖前面return,即使try中的return保存了值,下返回15
下例返回 依次打印 1 3 2
【无异常】
- 和上一致,就是catch块不执行,也是覆盖,返回15
情况5: try{} catch(){return;}finally{return;}
【有无异常】
- 和情况4一致,finally覆盖前面,都返回15
情况6: try{ return;}catch(){return;} finally{return;}
【有无异常】
- 和情况4一致,finally覆盖前面,都返回15