A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 影凡 中级黑马   /  2013-12-15 00:12  /  1277 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们知道在异常处理的时候,无论try-catch是否顺利执行完毕,都会执行finally语句。在哪些特殊情况下会不执行finally块呢?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

倒序浏览
执行 system.exit(o)  时候 就不执行了  即退出jvm 了
回复 使用道具 举报
在catch语句中添加 System.exit(0) 语句,当发生异常而执行catch中的代码时,终止当前正在运行的 Java 虚拟机,而不会执行finally中的语句。
public static void exit(int status) 参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
不能在catch中写入return语句,否则finally中的代码会被执行。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
相对于try-catch-finally程序块而言,try-catch的执行流程以及执行结果还是比较简单的。
首先执行的是try语句块中的语句,这时可能会有以下三种情况:
    1.如果try块中所有语句正常执行完毕,那么就不会有其他的“动做”被执行,整个try-catch程序块正常完成。
    2.如果try语句块在执行过程中碰到异常V,这时又分为两种情况进行处理:
-->如果异常V能够被与try相应的catch块catch到,那么第一个catch到这个异常的catch块(也是离try最近的一个与异常V匹配的catch块)将被执行;如果catch块执行正常,那么try-catch程序块的结果就是“正常完成”;如果该catch块由于原因R突然中止,那么try-catch程序块的结果就是“由于原因R突然中止(completes abruptly)”。
-->如果异常V没有catch块与之匹配,那么这个try-catch程序块的结果就是“由于抛出异常V而突然中止(completes abruptly)”。
    3.如果try由于其他原因R突然中止(completes abruptly),那么这个try-catch程序块的结果就是“由于原因R突然中止(completes abruptly)”。

3.3 try-catch-finally程序块的执行流程以及执行结果
try-catch-finally程序块的执行流程以及执行结果比较复杂。


1.如果try块中所有语句正常执行完毕,那么finally块的居于就会被执行,这时分为以下两种情况:
-->如果finally块执行顺利,那么整个try-catch-finally程序块正常完成。
-->如果finally块由于原因R突然中止,那么try-catch-finally程序块的结局是“由于原因R突然中止(completes abruptly)”
2.如果try语句块在执行过程中碰到异常V,这时又分为两种情况进行处理:
-->如果异常V能够被与try相应的catch块catch到,那么第一个catch到这个异常的catch块(也是离try最近的一个与异常V匹配的catch块)将被执行;这时就会有两种执行结果:
-->如果catch块执行正常,那么finally块将会被执行,这时分为两种情况:
-->如果finally块执行顺利,那么整个try-catch-finally程序块正常完成。
-->如果finally块由于原因R突然中止,那么try-catch-finally程序块的结局是“由于原因R突然中止(completes abruptly)”
-->如果catch块由于原因R突然中止,那么finally模块将被执行,分为两种情况:
-->如果如果finally块执行顺利,那么整个try-catch-finally程序块的结局是“由于原因R突然中止(completes abruptly)”。
-->如果finally块由于原因S突然中止,那么整个try-catch-finally程序块的结局是“由于原因S突然中止(completes abruptly)”,原因R将被抛弃。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
给你简单说下啊:希望你能明白

不管try中是否有异常,“都会”执行finally,如果有未处理的异常,则处理finally后直接返回并将异常一起带回,这样就不再处理finally后面的语句。
分析如下:
程序1:在method()因为抛出的异常未处理,跳转到finally执行System.out.println('c');
然后直接返回main()的调用处,带回的异常被catch到,所以执行System.out.println('m');
之后执行System.out.println('n');所以最终结果是cmn
程序2:在method()中产生异常并被catch到,所以执行System.out.println('b');
不管是否有异常都会执行finally(System.out.println('c');)
然后执行System.out.println('d');
调用返回(异常已处理),所以直接执行System.out.println('n');
最终结果是:bcdn


因为程序一没有在try-catch-finally中捕捉到异常,所以不会执行finally后的语句,而程序二捕捉到并处理了异常,所以会执行finally后面的语句。
一句话:只要发生异常并且没有全部捕捉到,就不会执行finally后面的语句。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
其实我是想问除了catch中有System.exit();外,具体还有哪些情况会不执行执行finally代码块~
回复 使用道具 举报
class FuShuException extends Exception
{
        FuShuException(String msg)
        {
                super(msg);
        }
}
class Demo5
{
        int div(int a,int b)throws FuShuException
        {
                if (b<0)
                         throw new FuShuException("出现除数为负数了");
                return a/b;
        }
}

public class ExceptionDemo5
{
        public static void main(String[] args) throws Exception
        {
                Demo5 d = new Demo5();
                try
                {
                        int x = d.div(4,-1);

                }
                catch(FuShuException e)
                {
                        System.out.println(e.toString());
                        return;  //System.exit(0):系统退出,jvm结束
                }
                finally
                {
                        System.out.println("finally");//finally中存放一定会被存放的代码
                }
                                       
                System.out.println("over");
        }
}
finally中定义的通常是 关闭资源代码,因为资源必须释放;一般情况他的代码都会被执行
finally只有一种情况不会执行,当执行到System.exit(0);
如上代码,如果将return;换成System.exit(0);代码中的finally语句就不会执行,因为系统退出,jvm结束了

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马