`
aeritheve
  • 浏览: 32946 次
  • 性别: Icon_minigender_2
  • 来自: 沈阳
社区版块
存档分类
最新评论

finally语句

阅读更多

finally语句

 

finally的用法:只能用在try/catch语句中,并且附带着一个语句块,表示这段语句最终总是被执行。请看下面的代码:

public final class FinallyTest {

    public static void main(String[] args) {
        try {
            throw new NullPointerException();
        } catch (NullPointerException e) {
            System.out.println("程序抛出了异常");
        } finally {
            System.out.println("执行了finally语句块");
        }
    }

}

运行结果说明了finally的作用:

1. 程序抛出了异常

2. 执行了finally语句块

 

有没有一种情况使finally语句块得不到执行呢?大家可能想到了return、continue、break这三个可以打乱代码顺序执行语句的规律。那我们就来试试看,这三个语句是否能影响finally语句块的执行:

public final class FinallyTest {

    // 测试return语句
    public ReturnClass testReturn() {
        try {
            return new ReturnClass();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("执行了finally语句");
        }
        return null;
    }

    // 测试continue语句
    public void testContinue() {
        for (int i = 0; i < 3; i++) {
            try {
                System.out.println(i);
                if (i == 1) {
                    continue;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                System.out.println("执行了finally语句");
            }
        }
    }

    // 测试break语句
    public void testBreak() {
        for (int i = 0; i < 3; i++) {
            try {
                System.out.println(i);
                if (i == 1) {
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                System.out.println("执行了finally语句");
            }
        }
    }

    public static void main(String[] args) {
        FinallyTest ft = new FinallyTest();
        // 测试return语句
        ft.testReturn();
        System.out.println("----------return over----------");
        // 测试continue语句
        ft.testContinue();
        System.out.println("----------continue over----------");
        // 测试break语句
        ft.testBreak();
        System.out.println("----------break over----------");
    }
}

 

public class ReturnClass {
    public ReturnClass() {
        System.out.println("执行了return语句");
    }
}

上面这段代码的运行结果如下:

执行了return语句

执行了finally语句

----------return over----------

0

执行了finally语句

1

执行了finally语句

2

执行了finally语句

----------continue over----------

0

执行了finally语句

1

执行了finally语句

----------break over----------

 

return、continue和break都没能阻止finally语句块的执行。

从输出的结果来看return语句是在finally语句块之后执行的,也就是说finally语句块是在程序退出方法之前被执行的。同样,finally语句块是在循环被跳过(continue)和中断(break)之前被执行的。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics