【问题标题】:Exception Handling try without catch, but with finally [duplicate]异常处理尝试不使用catch,但使用finally [重复]
【发布时间】:2016-10-07 10:26:43
【问题描述】:
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 运行它。
  • 在一次采访中了解到这个问题,

标签: java


【解决方案1】:

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

当您从 finally 中删除返回时,代码所做的是抛出一个检查异常,这要求您抛出异常或捕获它,这就是编译器错误的原因。

看看

finally 中的 return 行为在 Java 语言规范中有描述,这里有很好的解释 http://thegreyblog.blogspot.it/2011/02/do-not-return-in-finally-block-return.html

【讨论】:

  • 您能否详细说明为什么异常被丢弃?我没有找到任何直接解释为什么会在您的链接中发生这种情况。
  • 在问题中它说在删除返回语句时,就会出现问题。
  • @cslotty 当你return 时,异常显然被丢弃 并且不需要被捕获。这就是为什么您没有收到预期的错误。
  • 是的,但这不是问题 - 问题是“任何人都可以提供解决方案,说明为什么会出现编译错误吗?” -> 添加“抛出异常”后编译错误消失。
  • @cslotty “解决方案”这个词被 OP 误用,应该是“答案”。问题的其余部分是 “...为什么会出现编译错误?”.
【解决方案2】:

此代码适用于 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");
        }
    }
}

对我来说唯一的编译问题是方法声明中缺少“抛出异常”。

这是输出:

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

【讨论】:

  • 你没有抓住重点。使用返回int 的方法不会出现编译错误,但是当它是void 方法时,您会这样做,问题是为什么会出现这种情况。这不是问题的答案。
  • 好吧.....如果你运行原始代码,你可以看到异常显然被忽略了——它进入finally并返回int。那么,如果行为是明显的并且可以测试和证明,为什么要问这样一个问题呢? - 另外,问题是“任何人都可以提供解决方案,说明为什么会出现编译错误吗?”这就是我所做的 - 添加“抛出异常”时编译错误消失。
  • 一点也不明显为什么异常被忽略了,这是个问题。
  • 不。 “任何人都可以为它为什么给出编译错误提供解决方案吗?” -- 必须更改原始问题以反映您所说的内容。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 2014-04-19
  • 1970-01-01
  • 2018-06-24
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多