java 最后的异常_关于java:异常处理尝试没有catch,但最后

本问题已经有最佳答案,请猛点这里访问。

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。那么为什么要问这样一个问题,如果行为是显而易见的,可以进行测试和证明? - 另外,问题是"任何人都可以为解决编译错误的原因提供解决方案吗?"这就是我所做的 - 编译错误消失了添加"抛出异常"。

显然,为什么忽略异常并不明显,这就是问题所在。

不。"任何人都可以为解决编译错误的原因提供解决方案吗?" - 原来的问题必须改变以反映你所说的话。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值