本问题已经有最佳答案,请猛点这里访问。
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");时导致编译问题。
任何人都可以为解决编译错误的原因提供解决方案吗?
问题似乎是为什么当你明显没有捕获异常或声明它被抛出时,它没有在第一种情况下给出错误。
在Java8中运行得很好......
@Paul我在Java 8中遇到了错误。
@Gendarme只是注意到了我的错误。 我用RuntimeError运行它。
我在接受采访时了解了这个问题,
我通过try和finally处理已检查的异常,并且不想使用throws Exception。 在这种情况下,为什么编译错误会来临?
@Gendarme我通过try和finally处理已检查的异常,并且不想使用throws Exception。 在这种情况下,为什么编译错误会来临?
问题是finally块中的return语句将导致可能在try块中抛出的任何异常被丢弃。
当你从finally中删除返回时,代码正在做的是抛出一个检查异常,这需要你抛出异常或者你抓住它,这就是编译器错误的原因。
看着
https://www.owasp.org/index.php/Return_Inside_Finally_Block
从Java中的finally块返回
最终总是在Java中执行吗?
最终返回的行为在Java语言规范中有所描述,这里有很好的解释http://thegreyblog.blogspot.it/2011/02/do-not-return-in-finally-block-return.html
你能详细说明为什么抛弃异常吗?我没有立即解释为什么在您的链接中发生这种情况。
在问题中,它表示在删除return语句时,会出现问题。
@cslotty当你return时,异常显然被丢弃,不需要被捕获。这就是为什么你没有得到你期望得到的错误。
是的,但这不是问题 - 问题是"任何人都可以解决为什么它会给出编译错误?" - >添加"throws Exception"时编译错误消失。
@cslotty"解决方案"这个词被OP误用,应该是"回答"。问题的其余部分说"......为什么会出现编译错误?"。
但是,当不再返回int时,编译错误就会出现.....并且答案和解决方案都是,添加"抛出异常";-)让我们同意"要问为什么在它们之间存在这样的差异要复杂得多返回int并且什么都不返回",但遗憾的是,问题并不清楚。 ;-)
@cslotty这个问题指出他做了两个选择:第一个他回来,第二个他没有回来。第一个吞下已检查的异常,因此编译器没有问题,而第二个不吞下,当抛出一个已检查的异常时,你必须抓住它或抛出它。我的第二句话解释了这个。
此代码适用于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)
你错过了这一点。使用返回int的方法不会出现编译错误,但是当它是void方法时,问题就是为什么会出现这种情况。这不是问题的答案。
好吧.....如果您运行原始代码,您可以看到Exception明显被忽略 - 它进入finally并返回int。那么为什么要问这样一个问题,如果行为是显而易见的,可以进行测试和证明? - 另外,问题是"任何人都可以为解决编译错误的原因提供解决方案吗?"这就是我所做的 - 编译错误消失了添加"抛出异常"。
显然,为什么忽略异常并不明显,这就是问题所在。
不。"任何人都可以为解决编译错误的原因提供解决方案吗?" - 原来的问题必须改变以反映你所说的话。