try-catch-finally执行顺序的探索(建议采用调试)
## try-catch-finally执行顺序的探索(建议采用调试)
1.try{ }块中捕捉到异常执行顺序
try中的return不会执行---》跳到catch块中执行,执行其中的return语句,但是不会跳出去--》继续执行finally中语句并在其中的return语句返回
package com.xurong.test;
/**
* @auther xu
* @date 2022/3/22 - 20:48
*/
public class test {
public static void main(String[] args) {
int a = WithException();
System.out.println(a);
}
public static int WithException(){
int i=10;
try{
System.out.println("i in try block is : "+i);
i = i/0;//产生异常
return --i;
}
catch(Exception e){
System.out.println("i in catch - form try block is : "+i);
--i;
System.out.println("i in catch block is : "+i);
return --i;
}
finally{
System.out.println("i in finally - from try or catch block is--"+i);
--i;
System.out.println("i in finally block is--"+i);
return --i;
}
}
}
i in try block is : 10
i in catch - form try block is : 10
i in catch block is : 9
i in finally - from try or catch block is--8
i in finally block is--7
6
2.try{ }块中没有捕捉到异常执行顺序
执行try{ }块中的return,将执行的return值保存在栈中---》没有异常产生,不会执行catch()中的语句--》执行finally内容
package com.xurong.test;
/**
* @auther xu
* @date 2022/3/22 - 20:48
*/
public class test {
public static void main(String[] args) {
int a = WithException();
System.out.println(a);
}
public static int WithException(){
int i=10;
try{
System.out.println("i in try block is : "+i);
i = i/1;//没有产生异常
return --i;
}
catch(Exception e){
System.out.println("i in catch - form try block is : "+i);
--i;
System.out.println("i in catch block is : "+i);
return --i;
}
finally{
System.out.println("i in finally - from try or catch block is--"+i);
--i;
System.out.println("i in finally block is--"+i);
return --i;
}
}
}
i in try block is : 10
i in finally - from try or catch block is--9
i in finally block is--8
7
结论一:
return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)
结论二:
finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。
补充:
规则:
1.try块是必须的,catch块和finally块都是可选的,但必须存在一个或都存在。try块不能单独存在。
2.try块里的语句运行中出现异常会跳过try块里其他语句,直接运行catch里的语句。
3.无论try块中是否有异常,无论catch块中的语句是否实现,都会执行finally块里的语句。
4.只有一种办法不执行finally块里的语句,那就是调用System.exit(1);方法,即退出java虚拟机。
参考:
[https://www.nowcoder.com/profile/168268554/test/54165848/44594#summary]: