【问题标题】:return statement and exception in try block in javajava中try块中的return语句和异常
【发布时间】:2011-04-15 01:59:33
【问题描述】:
public class Test2 {
    public static void main(String args[]) {

        System.out.println(method());
    }

    public static int method() {
        try {
            throw new Exception();
            return 1;
        } catch (Exception e) {
            return 2;
        } finally {
            return 3;
        }
    }
}

在这个问题中,try 块有 return 语句并且也抛出异常...... 它的输出是编译器错误....

我们知道 finally 块会覆盖 try/catch 块中的返回或异常语句... 但是这个问题在尝试块中都有...... 为什么输出是错误的?

【问题讨论】:

  • 您介意与我们分享实际的编译器错误吗?虽然这是一个相当微不足道的案例,但总的来说,发布不完整/模棱两可的问题会降低获得好答案的机会。

标签: java exception-handling try-catch


【解决方案1】:

因为您的 return 语句无法访问 - 执行流程永远无法到达该行。

如果throw 语句位于if 子句中,则return 可能是可访问的并且错误将消失。但在这种情况下,在那里有return 是没有意义的。

另一个重要注意事项 - 避免从 finally 子句返回。例如,Eclipse 编译器会在 finally 子句中显示有关 return 语句的警告。

【讨论】:

  • 说得很好。为您的回答 +1
【解决方案2】:

编译器异常来自,就像我的 Eclipse 老兄说的那样

Unreachable code    Test2.java  line 11 Java Problem

你的主代码块的 return 语句永远不会到达,因为之前抛出了异常。

请注意,您的 finally 块的 return 语句至少是一个设计缺陷,就像 Eclipse 再次所说的那样

 finally block does not complete normally   Test2.javajava  line 14 Java Problem

确实,由于 finally 块在这里只是为了提供一些干净的关闭,它不会返回会覆盖该方法通常返回的结果的东西。

【讨论】:

  • +1。我知道你想说“设计缺陷”而不是“设计法则”:)
【解决方案3】:

无论如何都会调用throw new Exception(),因此try 块中跟在throw 后面的任何内容都是无法访问的代码。因此出现错误。

【讨论】:

    【解决方案4】:
    public class Test2 {
        public static void main(String args[]) {
    
            System.out.println(method());
        }
    
        public static int method() {
            try {
                throw new Exception();
                return 1; //<<< This is unreachable 
            } catch (Exception e) {
                return 2;
            } finally {
                return 3;
            }
        }
    }
    

    它最终应该返回 3。

    【讨论】:

      【解决方案5】:

      因为 try 块中的“return”关键字无法访问,这就是您收到编译时错误的原因。从try块中省略'return'关键字,然后运行您的程序,您将成功编译。

      【讨论】:

        猜你喜欢
        • 2014-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        • 2020-06-17
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多