《Java Puzzlers》学习笔记之异常处理:finally中使用跳转语句的后果

转裁请注明本文地址啊^_^

在《Java Puzzles - Puzzle 36:Indecision》中,通过例子详细的讨论了异常处理finally作用域使用return的后果,并且引申说明,finally作用域里还不应该使用break和continue这个跳转语句。那如果在finally作用域里使用了break或continue会怎样呢?

先看看使用break会怎样。码个例子先:
import java.io.*;

public class ExceptionIndecisionTest
{
    static int indecisionException()
    {
        while(true)
        {
            try
            {
                System.out.println("try block");
                throw new Exception();
            }
            catch(Exception e)
            {
                System.out.println("catch Exception");
            }
            finally
            {
                System.out.println("finally block");
                break;
            }
        }
        System.out.println("out block");
        return 2;
    }

    public static void main(String[] args)
    {
        System.out.println("return val = "+indecisionException());
    }
}

编译运行:
运行结果

可以看到,代码按照try-catch-finally的顺序运行完后并没有退出方法,而是跳出finally运行剩下的代码

其实还可以进一步改造这个代码

import java.io.*;

public class ExceptionIndecisionTest
{
        /*
        * 增加异常抛出
        */
        static int indecisionException() throws Exception
        {
                while(true)
                {
                        try
                        {
                                System.out.println("try block");
                                throw new Exception();
                                //return 0;
                        }
                        /*
                        * 这里不处理异常,由调用者处理
                        */
                        /*catch(Exception e)
                        {
                                System.out.println("catch Exception");
                        }*/
                        finally
                        {
                                System.out.println("finally block");

                                //return 1;
                                //continue;
                                break;
                        }
                }

                System.out.println("out block");
                return 2;
        }

        public static void main(String[] args)
        {
                /*
                * 增加异常处理
                */
                try
                {
                        System.out.println("return val = " + indecisionException());
                }
                catch(Exception e)
                {
                        System.out.println("catch Exception");
                }
        }
}

编译运行:
运行结果
呐呢!通过结果可以看到,代码不仅没有在运行完finally后退出indecisionException方法,而且此方法的调用者还没能捕获到抛出的异常。

那么把break语句换成continue又会更怎样呢?小伙伴们应该能脑补到结果吧——代码会在while-continue间根本停不下来啦!

(完)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值