黑马程序员技术交流社区

标题: 关于finally的问题 [打印本页]

作者: 凡延海    时间: 2012-5-20 16:32
标题: 关于finally的问题
public class FinallyTest{
        public static void main(String[] args)
        {
                try
                {
                        System.out.println("Hello");
                        System.exit(0);//return;
                }
                finally
                {
                        System.out.println("Goodbye");
                }
        }
}
我在学习finally感觉就是不论前边不论程序结不结束都是要执行finally中的代码的,我试着用return和System.exit来做,return的时候两个都打印,用System.exit的时候就只打印第一句,我糊涂了,请问return和System.exit的内部机制是怎样的呢。
作者: 8161776    时间: 2012-5-20 16:44
本帖最后由 杨尧 于 2012-5-20 16:46 编辑

对于只有一个单一方法的类或者系统来说是一样的,但是对于含有多个类和方法,且调用关系比较复杂时就不一样了。
System.exit()是指所有程序(方法,类等)停止,系统停止运行。
return只是这一个方法停止,并不影响其他方法的顺序运行。
System.exit( ) 通常是值退出程序
而return是指退出某个方法
比如:
void a(){
  b();
  c();
  d();
}其中b()中是return.
c()是System.exit();
那么
b()会执行,c()会执行,而d()不会被执行。
作者: 程旦    时间: 2012-5-20 16:45
楼主 finally有一种情况不会运行  就是遇到 System.exit(0);   这语句是直接告诉虚拟机 结束程序  所以是读不到finally语句的。。。。这是一种特殊情况  楼主不必深究  记住就好
作者: 陆建平    时间: 2012-5-20 16:52
return:

       是一个关键字,表明返回调用当前方法的方法中。 如果是在main中,调用它的方法就是系统了,在单线程时也可以起到退出JVM的作用,但没有返回值,存在多线程的话main线程并不能保证JVM退出.,因为要所有的线程都结束才行,如果是在其他地方,这个语句只能返回上级调用中。

       即在非程序入口方法中,则System.exit(0)直接终止程序,就算后面有代码也不执行了,而return则返回至调用该方法的地方,如果后面还有代码则继续执行。

       这个在main()中的区别:
        当用return返回时,main()并不能立即运行结束,而用System.exit(数值);(system.exit(0)表示程序正常退出,system.exit(1)表示非正常退出,都没有返回值))时,main()将立即无条件的结束。


作者: 余宏    时间: 2012-5-20 19:46
finally 语句块通常是都要执行的,但是有几种情况例外:
1
在 try 语句块中执行了 System.exit (0) 语句,终止了 Java 虚拟机的运行。
2
在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。
3
还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了。当然这也是一种特殊情况。在此只是说明上面的问题
作者: 凡延海    时间: 2012-5-20 19:51
谢谢众位告诉,俺明白了。
作者: 韩新凯    时间: 2012-5-20 23:09
return还要执行finally,System.exit(0);是推迟虚拟机。
除了System.exit(0);finally总会执行




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