Java异常捕获之try-catch-finally-return的执行顺序

情况1:try块中没有抛出异常try和finally块中都有return语句

public static int NoException(){

    int i=10;

    try{

        System.out.println("i in try block is"+i);

        return --i;

    }catch(Exception e){

        --i;

        System.out.println("i in catch - form try block is"+i);

        return --i;

    }finally{


        System.out.println("i in finally - from try or catch block is"+i);

        return --i;
    
    }
}


执行结果:

i in try block is10
i in finally - from try or catch block is9
the method value is8

执行顺序:执行try块,执行到return语句时,先执行return的语句,--i,但是不返回到main 方法,执行finally块,遇到finally块中的return语句,执行--i,并将值返回到main方法,这里就不会再回去返回try块中计算得到的值

 

情况2:try块中没有抛出异常,仅try中有return语句

代码:

public static int NoException(){
		int i=10;
		try{
			System.out.println("i in try block is--"+i);
			return --i;
		}catch(Exception e){
			--i;
			System.out.println("i in catch - form try 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
the method value is--9

顺序:try中执行完return的语句后,不返回,执行finally块,finally块执行结束后,返回到try块中,返回i在try块中最后的值

 

情况3:try块中抛出异常try,catch,finally中都有return语句

代码:

	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;
		}
	}
  1. 执行结果:

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
the method value is--6

顺序,抛出异常后,执行catch块,在catch块的return的--i执行完后,并不直接返回而是执行finally,因finally中有return语句,所以,执行,返回结果6

 

情况4,catch中有return,finally中没有,同上,执行完finally语句后,依旧返回catch中的执行return语句后的值,而不是finally中修改的值

情况5:try和catch中都有异常,finally中无return语句

public static int CatchException(){
		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);
			int j = i/0;
			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 finally - from try or catch block is--10
i in finally block is--9
Exception in thread "main" java.lang.ArithmeticException: / by zero
 at exception.ExceptionTest0123.CatchException(ExceptionTest0123.java:29)
 at exception.ExceptionTest0123.main(ExceptionTest0123.java:17)

执行顺序:在try块中出现异常,到catch中,执行到异常,到finally中执行,finally执行结束后判断发现异常,抛出

 

情况6:try,catch中都出现异常,在finally中有返回

public static int CatchException(){
		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);
			int j = i/0;
			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;
		}
	}

  1. 运行结果:

i in try block is--10
i in catch - form try block is--10
i in finally - from try or catch block is--10
i in finally block is--9
the method value is--8

执行顺序:try块中出现异常到catch,catch中出现异常到finally,finally中执行到return语句返回,不检查异常

 

没有catch,只有try和finally时,执行顺序和上面的几种情况差不多,只是少了catch块的执行

 

总结:
   (1)正常情况下,执行到 try 中的异常跳转到 catch, 执行到 catch 中的异常跳转到 finally。同一个块中,异常后面的语句不执行。
   (2)无论 try catch中有没有 return 都要执行 finally 块的内容。若有,只执行try catch中的 return 后面有语句,不return。
   (3)finally 有 return 时,现场 return 现场值,不再返回到 try 和 catch 块,也不会抛出 try 和 catch 块中的异常。因此不能在 finally 块中return
   (4)finally 内没有 return , 执行完 finally 块后返回到 try catch块中,或 return 当时的值抛出异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值