try catch finally 执行简介

在这里插入图片描述关于try catch finally 执行顺序的笔试面试题目非常的多,我曾经在牛客网刷题的时候不止一次的碰到过,而且不止一次的做错过,这里面需要涉及的细节如果不弄清楚每次做题就会产生似是而非的感觉。这次查阅了很多相关资料,关于try catch finally 执行顺序各方面基本都讲到了。不足之处欢迎指出。
try catch finally 执行顺序仅仅在下面4中情况下不会执行finally语句 :①.如果在try 或catch语句中执行了System.exit(0)。②.在执行finally之前jvm崩溃了。③.try语句中执行死循环。④.电源断电。除了以上的四种情况外,finally语句都会执行,finally语句执行时会有以下原则。①、不管有没有出现异常,finally块中代码都会执行; public void demo1(){ try { System.out.println(result); } catch (Exception e) { System.out.println(e.getMessage()); } finally { System.out.println("finally trumps. "); }//输出结果为:resultfinally trumps .上面代码可知如果未出现异常是顺序执行try和finally代码块。②、当try和catch中有return时,finally仍然会执行;public static int demo2() { try { return 0; } finally { System.out.println(“finally trumps return.”); } }//输出结果finally trumps return.0 当finally里面没有return语句是,执行try 和finally语句之后最后再执行return。③、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;public static int demo3() { int i = 0; try { i = 2; return i; } finally { i = 12; System.out.println(“finally trumps return.”); } }//输出结果 finally trumps return. 2此处中finally中对i赋值12但是demo3的返回值仍然是2,也就是在finally中对i赋值并未改变i的返回值,这里需要详细的讲一下,此处涉及到了jvm机制。先给出上面代码的字节码然后给出图解:public static demo3()I TRYCATCHBLOCK L0 L1 L2 L3 LINENUMBER 12 L3 ICONST_0 ISTORE 0 L0 LINENUMBER 14 L0 ICONST_2 ISTORE 0 L4 LINENUMBER 15 L4 ILOAD 0 ISTORE 2 L1 LINENUMBER 17 L1 BIPUSH 12 ISTORE 0 L5 LINENUMBER 18 L5 GETSTATIC java/lang/System.out : Ljava/io/PrintStream; LDC “finally trumps return.” INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V L6 LINENUMBER 15 L6 ILOAD 2 IRETURN L2 LINENUMBER 16 L2 FRAME FULL [I] [java/lang/Throwable] ASTORE 1 L7 LINENUMBER 17 L7 BIPUSH 12 ISTORE 0 L8 LINENUMBER 18 L8 GETSTATIC java/lang/System.out : Ljava/io/PrintStream; LDC “finally trumps return.” INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V L9 LINENUMBER 19 L9 ALOAD 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值