//Test.javapublic class Test {
    public static void main(String[] args) {
        try {
            throw new Exception("I am thrown");
        }
        catch(Exception e) {
            System.out.println("I am caught");
            e.printStackTrace();
        }
        finally {
            ///   line 11
        }
        System.out.println("Rest parts...."); // line 13
    }
} ///:~上例中, 将line 13移到line 11的位置, 与原来的输出结果完全一样.大家都知道finally块是无论异常是否抛出都会执行的一块代码, 既然这样, 那么把这些代码放到finally块中, 与放到外面有什么不同? try...catch...外面的代码不也同样会被执行吗? finally到底用来干嘛? 盼专家解答.

解决方案 »

  1.   

    对于catch中捕获异常并且不能继续下去的时候,可以在catch中返回,但一般释放所占资源的语句都是放在finally中..在这里,这一句特点不明显,因为捕获了这个小小的异常并对它进行了处理..
      

  2.   

    finally相当于一条后路.
    释放资源!eg:public static void Test(string fileName)
            {
                string fileName;
                System.IO.StreamReader sr=null;
                try
                {
                    sr=new System.IO.StreamReader(fileName);                
                }
                finally
                {
                    if(sr!=null)
                    {
                        sr.Close();
                    }
                }
            }
      

  3.   

    你的例子中效果是一样的,但下例中就不一样了:
        public static void main(String[] args) {
            try {
                throw new Exception("I am thrown");
            }
            catch(Exception e) {
                System.out.println("I am caught");
                e.printStackTrace();
                return;
            }
            finally {
                ///   line 11
            }
            System.out.println("Rest parts...."); // line 13
        }
    } ///
      

  4.   

    finally 结构使代码总会执行,为了确保一段代码不管发生什么异常都要被执行。使用 finally 可以清理非内存资源,比如:数据库连接,socket连接等,这些如果不手动关闭,java虚拟机的垃圾回收是不会跟你关闭的,使用finally可以保证即使出现异常之后确保可以关闭非内存资源。
      

  5.   

    麻烦各位不要照本宣科好不好??? 我就是看过了书, 再来问这个问题的.楼上各位的意思是: 如果异常被捕获, 程序就终止了. 我以前也一直是这样理解的, 如果真的是这样的话, finally当然有存在的必要. 这个谁都明白.但我的例子不知大家运行过没有, 异常被捕获以后, 余下的程序(我的代码中的13行以后)还是照常执行的啊.To rower203(华仔):你的代码好像说明了一些问题. 但是不是说finally仅仅是为return而存在的呢?
      

  6.   

    用法之一:
    你写一个插入的方法,或者一个删除的方法,
    调用这个方法后如果失败,将会有异常,
    此时数据库连接是不会自动关闭的,
    那么你在finally里写上关闭数据库连接的命令,
    这样不管程序执行成功与否
    数据库的连接都关闭,
    这样可以不必占用太都没必要的资源。
      

  7.   

    不一定就是return,还可能是异常的情况
        public static void main(String[] args) throws Exception {
            boolean error = true;
            try {
                if(error)
                   throw new Exception("I am thrown");
            }
            catch(Exception e) {
                System.out.println("I am caught");
                e.printStackTrace();
                throw e;
            }
            finally {
                ///   line 11
            }
            System.out.println("Rest parts...."); // line 13
        }这样11行然后会被执行,而13不会
      

  8.   

    UP,finally就是用来关闭资源的吧
      

  9.   

    你的代码有一个问题,那就是:捕捉了异常,但是却什么都没有做就把异常丢弃了(仅仅打印了一下异常).这当然就造成异常发生之后,程序还会继续向下执行,line13被执行.正确的做法应该是捕捉异常之后首先分析是否能够处理,能处理则进行处理,如果不能处理应该把此异常抛出(我个人觉得return也是不正确的处理).因为发生了异常,肯定程序运行中出了问题了,怎么能还继续向下进行呢?当然如果你为了某个目的,特地这样做,那就是例外了.
    所以是以上模式,则必须要把line13放到finally以确保被执行.
      

  10.   

    finally 不管发生异常没有,反正finally块都要执行(比如关闭文件操作) 唯一不被执行的情况是System.exit(0);
      

  11.   

    try...catch...中,假如try中,有CATCH里抓不住的异常,JVM就会当机,此时try...catch...后的代码就不会执行了,这时就见的到FINALLY的做用了~呵呵
      

  12.   

    就算try catch块里有return 语句,依然会执行finally里的代码,
    只这一点就有很大作用
    try获取异常如果不throw的话,那就会继续执行try块下面的代码,
    如果throw了新的exception那就和return 效果一样
      

  13.   

    finally语句保证try{}catch(){}是否抛出异常,finally{}语句都可以执行。典型的应用是释放资源
      

  14.   

    用不同的Case去理解它们的不同。