首先,必须承认,这种问题是存在的,确实会得不到异常其次,finially主要是解决资源泄漏问题,不应该在finally中返回值,你可以在你的try中返回。
在次:不应该在异常处理中完成某些业务处理!

解决方案 »

  1.   

    public class Test {
        public static void main(String[] args) throws Exception {
           String a = null;
            try{
                a.length();
            }
            catch(Exception e){
                throw new Exception("aaa");
            }
            finally{
                System.out.println("bbbb");
            }
        }
    }这个程序的输出是这样的:
    bbbb
    java.lang.Exception: aaa也就是说虽然你在catch里捕获了这个异常,又抛出一个新的异常,但是程序还是会在最后的时刻来执行下finally里的语句的。这样的好处我想不要我多说了吧?:)
      

  2.   

    在次:不应该在异常处理中完成某些业务处理!
    -----------------------------------------
    在异常处理的时候完成某些业务处理也未尝不可吧。比如我插入一条的记录。当然要先查找数据库,以免该记录存在。某查找的时间抛出了NotFoundException的时候,才可以进行插入的啊。还有,楼主不好意思哟,没看清楚你的问题。finally一般是用来做最后的处理,所以经常用它来释放一些需要释放的资源,这一点楼上说的不错~:)
      

  3.   

    finally中一般都是用来关闭未关闭的连接的
      

  4.   

    try
    catch
    finally
    结构中
    程序在try块捕获异常,跳转到相应的catch块内执行异常处理
    finally则是在退出该方法之前执行的,所以说不论正常或者是抛异常出去,都会执行finally中的语句,finally本身也可以抛异常也可以catch处理语句的异常,不过这时候就没有其他的finally来控制了。
    因此,在finally里面如果return 的话,那这个程序永远抛不出异常,道理等同于在catch块里return一般来说,最典型的应用就是插入数据的时候,在try块捕获SQL异常或者网络异常,执行回滚,然后在finally里面判断数据库连接是否关闭以及关闭没有关闭的数据库连接
      

  5.   

    楼上各位说的对,finally一般是用来释放一些资源。
      

  6.   

    to  dreamnear(哟哟) ,我指的是一般不建议用异常处理代替某些逻辑处理,至于是不是要抛出NotFoundException,然后在执行插入操作,这个各有各的做法
      

  7.   

    如果我的话,会这样子写public class TestExp {
        public static void main(String[] args) throws Exception {
           String a = null;
            try{
                a.length();
            }
            catch(Exception e){
                e.printStackTrace();        //如果我要找出原始的异常会加上这行,
                throw new MyException("aaa");//作为自己对异常补充,或者是自定义异常类(不是RuntimeExpcetion),
            }
            finally{
                System.out.println("bbbb");
            }
        }
    }最好根据语义来,要看具情况了。
      

  8.   

    如果在try-catch-finally中可能再会引发异常,必须再用try来括住。称之为异常嵌套。
      

  9.   

    解决的好习惯是自定义异常类。
    多覆盖(override)几个printStackTrace()方法啦。 ...
      

  10.   

    finally块是无论如何都会执行到的,比如程序产生错误时释放一些连接,例如:数据库连接,文件流,Socket连接这些比较占资源的东西。楼主这种做法有点不太合乎逻辑。