以前一直以为如果程序catch异常了,只有在try catch语句块后面写finally语句,才能继续执行finally里面的代码,但是如果不写finally,程序也会继续执行,那么这个finally不是没什么用吗,以前csdn的一个相关帖子:url=http://topic.csdn.net/t/20030821/12/2172217.html][/url]

解决方案 »

  1.   

    没有finally的情况:
    Connection conn = null;
    Statement stmt = null;
    try {
      Connection conn = DriverManager.getConnection(DBurl, userName, password);
      Statement stmt = conn.createStatement();
      stmt.close();
      conn.close();
    } catch(Exception e) {}
    那么如果createStatement()出现了异常,conn.close()还会执行吗?你打开的Connection还得到关闭吗?
    finally主要是用来保证一些回收资源的代码得到执行的,不管有没有异常,finally块中的代码都将被执行
    有finally的情况:
    Connection conn = null;
    Statement stmt = null;
    try {
      Connection conn = DriverManager.getConnection(DBurl, userName, password);
      Statement stmt = conn.createStatement();
    } catch(Exception e) {}finally {
      stmt.close();
      conn.close();
    }
      

  2.   

    finally 是必需执行的 所以一些需要处理的都可以放在这里面
    只有一种情况会阻止finally 子句执行, 就是虚拟机被关闭( 例如执行
    System.exit方法,或是机器关闭,或是电源关闭)。这意味着控制流程可能脱
    离正常的执行顺序。例如,如果有return在try语句块内的代码中,finally
    子句中的代码会在返回前执行。
    如果不用fianlly 不能保证那些资源得到处理
      

  3.   

    Connection conn = null; 
    Statement stmt = null; 
    try { 
      Connection conn = DriverManager.getConnection(DBurl, userName, password); 
      Statement stmt = conn.createStatement(); 
      
    } catch(Exception e) { } 
      stmt.close(); 
      conn.close(); 可能帖子没说清楚,我的意思是写在try语句块外面,向上面这样,程序也会继续执行
      

  4.   

    怎么没人回了:(
    写段例子程序吧public class Test {
    public static void main(String[] args) {
    try {
    m();
    } catch (Exception e) {
    e.printStackTrace();
    } finally{
    System.out.println("finally语句");
    }
    System.out.println("继续执行");
    }
    public static void m() throws Exception{
    throw new Exception();
    }
    }结果:
    java.lang.Exception
    finally语句
    at com.bjsxt.struts.Test.m(Test.java:15)
    at com.bjsxt.struts.Test.main(Test.java:6)
    继续执行
      

  5.   

    我觉得三楼说的情况是在try catch 语句块没有异常出现的时候下面的语句才会执行
    但是如果有异常出现,程序将会去执行catch语句块中的代码,而不执行下面的语句了。
      

  6.   

    那要是你在catch中return了呢?你自己试试看看
    finally还是有用的
      

  7.   

    public class Test {
        public static void main(String[] args) {
            try {
                m();
            } catch (Exception e) {
                e.printStackTrace();
                return;
            } finally{
                System.out.println("finally语句");
            }
            System.out.println("继续执行");
        }
        public static void m() throws Exception{
            throw new Exception();
        }
    }
    结果:
    java.lang.Exception
    finally语句
    at com.bjsxt.cms.base.Test.m(Test.java:17)
    at com.bjsxt.cms.base.Test.main(Test.java:7)
    ^_^
      

  8.   

    刚学这个,不知道可以这样理解不
    E1:
    try{
    int i=10/0;
    }
    catch(ArithmeticException e)
    {
    }
    若没有finally的话,程序能运行,但没有将最后的结果显示,如果有finally的话,就可以通过finally输出结果
    E2:
    try{
    int i=10/0;
    }
    catch(ArithmeticException e)
    {
    }
    finally{
    System.out.println(i);
    }
    结果输出为0;
      

  9.   

    这个吗得慢慢体会了多写几行代码就会体验到了。。finally是肯定会执行的,包括try中可能包含return语句但是如果是写在后面不写在finally里面,那么return后,那些代码是不会被执行滴。
      

  10.   

    要睡觉了,希望明天能看到答案,谢谢楼上的回帖,尤其是dreamhunter_lan 
      

  11.   

    try
    {
        。。
    }
    catch(Exception e)
    {
       // 如果throw这个异常或者return,那么如果没有finally,则程序不会继续往下走;但如果有finally,则还会执行finally中的语句。自己可以写个简单的例子看看就知道了,光靠理论不行的,要想进步快动手才是硬道理。
    }
    。。
      

  12.   

    main方法里面return,不知道它return到哪去了
      

  13.   


    说的对,还有种情况就是try里面出现return语句时,如果不finally,那么程序就会不执行异常后面的语句了,直接跳了出去,所以,我们做开发的时候,遇到try外面还有语句的时候,记得要加上finally语句块。。
      

  14.   

    还有一种情况,如果catch(){}中的代码也有异常抛出, finally中的代码也可以保证执行:
    try{
     ... ...
    } catch(){
     ... ...//这里抛出异常
    }finally{
     ... ...//必须执行的代码
    }
      

  15.   

    main方面里面的return就退出虚拟机了吧。
      

  16.   

    finaly块中的代码是在TRY CATCH执行之后执行的,不管有没有异常,在很多时候,这条语句很有用
      

  17.   

    finally主要做善后处理,像关闭资源等,如果你不需要什么善后处理,就不需要用finally
      

  18.   


    但一半最好用finally去保证出错时候的解决方案
      

  19.   

    请读这段代码:
    public class Test {
        public static void main(String[] args) {
            try {
                m();
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                System.out.println("finally语句");
            }
            System.out.println("继续执行");
        }
        public static void m() throws Exception{
            throw new Exception();
        }
    }结果:
    java.lang.Exception 
    finally语句 
    at com.bjsxt.struts.Test.m(Test.java:15) 
    at com.bjsxt.struts.Test.main(Test.java:6) 
    继续执行 
    虽然m()抛了异常,但后面的代码System.out.println("继续执行");
    不写在finally里面也会执行到
      

  20.   

    楼上的几位已经说的很明白啦,如果需要try 或者 catch里面有return语句,是绝对不会运行到外面地!如果运行在jdbc上面,很明显连接没有关闭!
      

  21.   

    现在才发现昨天写return那程序结果看错了,确实在catch中如果有return,后面要是没finally就不会执行
      

  22.   


    public static void main(String[] args) {}main方法的返回值是 void 也就是说他是没有返回值的,如果你要return的话 编译都不会通过。更别说执行了