异常处理尝试没有捕获,但最后

时间:2016-06-07 13:24:43

标签: java

public class ExceptionTest {
    public static void main(String[] args) {
        ExceptionTest et = new ExceptionTest();
        try {
            et.testMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }   
    public int testMethod()  {
        try {           
            throw new Exception();
        }finally {
            return 4;
        }
    }

上面的代码运行正常,但是当我将testMethod()的返回类型更改为void并将行return 4;更改为System.out.println("some print msg");时,会导致编译问题。

任何人都可以为解决编译错误的原因提供解决方案吗?

2 个答案:

答案 0 :(得分:4)

问题是finally块中的return语句会导致try块中可能抛出的任何异常被丢弃。

当您从finally中删除返回时,代码正在执行的操作是抛出一个已检查的异常,该异常需要您抛出异常或捕获它,这就是编译器错误的原因。

看看

最终返回的行为在Java语言规范中有所描述,并在http://thegreyblog.blogspot.it/2011/02/do-not-return-in-finally-block-return.html

中得到了很好的解释

答案 1 :(得分:0)

此代码适用于Java 8:

public class ExceptionTest {
    public ExceptionTest() {

    }

    public static void main(String[] args) {
        ExceptionTest et = new ExceptionTest();
        try {
            et.testMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void testMethod() throws Exception {
        try {
            throw new Exception();
        } finally {
            //return 4;
            System.out.println("hello finally");
        }
    }
}

对我来说,唯一的编译问题是方法声明中缺少“throws Exception”。

这是输出:

hello finally
java.lang.Exception
    at ExceptionTest.testMethod(ExceptionTest.java:17)
    at ExceptionTest.main(ExceptionTest.java:9)