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");
时,会导致编译问题。
任何人都可以为解决编译错误的原因提供解决方案吗?
答案 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)