黑马程序员技术交流社区

标题: finally语句块一定会执行吗? [打印本页]

作者: 黄敏文    时间: 2011-8-22 19:04
标题: finally语句块一定会执行吗?
见书上说的finally语句块无论在任何情况下都是会被执行到的,可是下面的代码中的finally语句块确没有执行到[code=java]public class TestFinally {
        public static void main(String[] args) {
                try {
                        System.out.println("try");
                        System.exit(0);
                } catch (Exception e) {
                        System.out.println("catch");
                } finally {
                        System.out.println("finally");
                }
        }
}[/code]
作者: 匿名    时间: 2011-8-22 19:09
API文档上描述System.exit方法会导致当前运行线程停止并使其它线程都终止,因此上面这段代码中的finally代码块不会被执行
作者: 匿名    时间: 2011-8-22 21:40
因为在try语句块中有了exit,exit会直接结束这个程序
作者: 匿名    时间: 2011-8-22 23:17
那finally语句块无论在任何情况下都是会被执行到的这句话有错误吧
作者: 匿名    时间: 2011-8-22 23:24
照你这么说,电脑当机,停电,病毒入侵……都可以否定这句话了
作者: 匿名    时间: 2011-8-25 15:49
俺的书上说任何情况下都必须执行的代码,就跟晚上回家打开门 必须要关门一样,虽然必须,但可以不关门,而finally不被执行的唯一情况就是先执行了System.exit()方法。也就是出了意外,嘿嘿
作者: 匿名    时间: 2011-8-25 19:13
System.exit()方法使得finally语句不能执行,特殊情况呗
作者: 匿名    时间: 2011-8-26 10:04
finally块里的代码无论try块中是否发生异常都会执行这是一般的说法,不是绝对的,发生下面情况是finally块将不会被执行:finally块中发生了异常;程序所在线程死亡;在前面代码中用到System.exit();关闭CPU;你的代码中出现System.exit(),程序退出,finally块当然无法运行。
作者: 匿名    时间: 2011-8-27 00:07
当使用java命令执行一个类的时候,就会启动一个JVM,即java虚拟机,从而加载并执行这个类。
api文档中对exit(int status)方法的描述为:Terminates the currently running Java Virtual Machine
即是说调用该方法会系统会终止当前正在运行的java虚拟机,当在try语句块中执行System.exit(0)这条语句时,系统会立即终止java虚拟机,java虚拟机都不运行了,当然不可能继续往下执行finally语句块了。

     当然你所说的finally语句块无论在任何情况下都是会被执行到的,其实是不严谨的,说这句话应该有一个前提就是当程序产生异常是能够程序本身所处理的,而上述情况是强制终止了JVM。

     回答完毕。。。
作者: 匿名    时间: 2011-8-29 15:35
这道题目我已经2次面试碰到了,当时的确是不知道exit()。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2