java finally块后的语句是否要执行

finally快中语句肯定执行,finally块后的语句视情况而定:若是catch中截获异常或者有异常抛出,则不执行,这也不完全,例如下边的例子:
package com.jessice.example;

public class test {

public static void main(String[] args) {
    new FinallyTest().test(0);
    System.out.println("------------------");
    new FinallyTest().test(1);
    }

}

class FinallyTest {

public void test(int a) {
    try {
        int i = 0 / a;
        } catch (Exception ex) {
        System.err.println("程序异常了!");
        } finally {
        System.out.println("执行finally!");
        }
        System.out.println("执行finally后面的语句!");
        }

}

结果就是

程序异常了!
执行finally!

执行finally后面的语句!

执行finally!
执行finally后面的语句!

阅读 5.2k
1 个回答

其实你如果理解了try,catch捕获异常的说法你就知道了,我来给题主分析一下这个代码的为啥会出现这个结果

1.程序异常了!
2.执行finally!
3.执行finally后面的语句!
4.执行finally!
5.执行finally后面的语句!

请注意,题主的代码中

class FinallyTest {

    public void test(int a) {
        try {
            int i = 0 / a;
            //1.异常捕获
        } catch (Exception ex) {
            System.err.println("程序异常了!");
        } finally {
            System.out.println("执行finally!");
        }
        //line2
        System.out.println("执行finally后面的语句!");
    }
}

  1. main方法向test方法中传递了a=0
  2. 由于除数为0,则抛出算数异常
  3. 由于题主代码中捕获了异常,则进入到catch块中,则打印第一行结果
  4. 执行完catch块后则进入到finally中则执行finally语句,则打印底二行结果
  5. 由于异常被catch块捕获了之后,则表示程序还是可以正常的执行的,则执行line2的代码,打印第句话
  6. main函数向test方法中传递a=1
  7. 由于除数不为0,则正常执行。输出后面的结果。
总结:finally后面的语句这个分几种情况
  1. 异常被捕获:finally代码正常执行并且finally后面正常的代码还是可以继续执行
  2. 异常未被捕获:finally代码正常执行,并将异常向上一层调用方抛出,但是finally后面正常的代码不再执行
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题