Excepiton

今天突然想不起异常的分类,就去搜了一下异常的分类,点开了这篇博客,分类是想起来了,但博客中给的一个引子让我疑惑了,我是真的不明白怎么回事,看完博客和下面的评论发现问题在于finally块中放return和throw Exception时的表现,就自己做了测试,虽然道理不明白,但是表象还是总结出来了,觉得够用。

异常的结构:

Excepiton_第1张图片

Exception分为受检异常和非受检异常(RuntimeException),非首检异常必须显式处理,否则编译通不过,RuntimeException不用。

finally语句块中包含return和throw Exception:

public class TestException {  
    boolean test01() throws Exception {  
        try {  
            return test02();  
        } catch (Exception e) {  
            System.out.println(e.getMessage());
            throw e;
        } finally {  
            return true;  
        }  
    }  

    boolean test02() throws Exception {  
        throw new Exception("ExcptionOf02");
    }  

    public static void main(String[] args) {  
        TestException test = new TestException();  
        try {  
            System.out.println(test.test01());  
        } catch (Exception e) {  
            System.out.println(e.getMessage());
        }  
    }  
}  

如果finally中成功执行到return时,会吃掉test01()catch块中抛出的异常,也就是test01()表现为没有异常。

public class TestException {  

    boolean test01() throws Exception {  
        try {  
            return test02();  
        } catch (Exception e) {  
            System.out.println(e.getMessage());
            throw e;
        } finally {  
            throw new Exception("ExcptionOf01");
        }  
    }  

    boolean test02() throws Exception {  
        throw new Exception("ExcptionOf02");
    }  

    public static void main(String[] args) {  
        TestException test = new TestException();  
        try {  
            System.out.println(test.test01());  
        } catch (Exception e) {  
            System.out.println(e.getMessage());
        }  
    }  
}  

如果finally中抛出了异常,则程序抛出finally中抛出的异常,test01()catch块中抛出的异常被忽略。

public class TestException {  

    boolean test01() throws Exception {  
        try {  
            return test02();  
        } catch (Exception e) {  
            System.out.println(e.getMessage());
            throw e;
        } finally {  
            if(true)
            {
                throw new Exception("ExcptionOf01");
            }
            return true;  
        }  
    }  

    boolean test02() throws Exception {  
        throw new Exception("ExcptionOf02");
    }  

    public static void main(String[] args) {  
        TestException test = new TestException();  
        try {  
            System.out.println(test.test01());  
        } catch (Exception e) {  
            System.out.println(e.getMessage());
        }  
    }  
}  

如果finally块中抛出了异常,并且有return语句,执行到抛出异常以后,程序中断,return不会执行。

总结来说就是,以finally执行结果为准。

当然以上都是为了验证某些问题,实际项目中一般也不会在finally中做这些事情。

你可能感兴趣的:(java,exception)