【问题标题】:Why is a "finally" block required in this code为什么此代码中需要“finally”块
【发布时间】:2014-08-27 08:32:15
【问题描述】:

我知道创建一个没有 最后阻塞。所以在修改这段代码时,我想不通 什么 Java 逻辑(例如规则、理论)迫使我包含 finally 块 在这段代码中 - 以及为什么 finally 块必须包含一个 return 在里面声明。换句话说,如果我删除 finally 完全阻塞我收到一个错误,如果我替换 return 语句 在 finally 块与其他任何东西(例如 System.out.printl(''foo")),我 仍然收到一个错误,要求我包含一个 return 语句。再次, 此处编写的代码编译并运行良好。我只是想了解 try-catch-finally 构造背后的一些理论(ps 我理解 这都是关于“异常处理”的......但我的问题更多的是关于 代码流和返回语句)。

class foo {
    int getInt() {
        try {
            String[] students = {"student1", "student2"};
            System.out.println(students[4]);
        }
        catch (Exception e) {
            return 10;
        }
        finally {
            return 20;
        }
    }
    public static void main(String args[]) {
        foo classSize = new foo();
        System.out.println(classSize.getInt());
    }
}

【问题讨论】:

  • 诀窍是阅读错误信息。没有 finally 块,如果没有异常,该方法返回什么?
  • return 20 也可以在 try/catch 之外,在方法的末尾,或者在 try 块的末尾。不过,上面的做法并没有错。
  • 拥有finally 块可以修复编译,但从逻辑上讲这是一个错误。
  • (我的偏好是在方法的末尾。或者在此处添加注释,指出假设 return 出现的位置。)
  • 有人在给你一个诡计问题。 finally 块中的20 将在 catch 块之后执行,是否替换了10? [提示:是] finally 块中的 return 是合法的,但 是个坏主意。

标签: java try-catch-finally


【解决方案1】:

考虑没有finally的执行路径

int getInt() {
    try {
        String[] students = {"student1", "student2"};
        System.out.println(students[4]);
        // no return
    }
    catch (Exception e) {
        return 10; // if an exception occurs 
    }
    // no return
}

如果没有抛出异常会发生什么?你不会有返回值。

您可以提供finally 并在此处放置退货,也可以在try-catch 块之外放置退货。

请注意,try-catch-finally 块中的finally 有一个return 语句,它将取代catchreturn 语句,因为如果finally 块关联的try[-catch] 是执行。您可能想要使用以下内容

int getInt() {
    try {
        String[] students = {"student1", "student2"};
        System.out.println(students[4]);
        // the return could be here as well
    }
    catch (Exception e) {
        return 10; // in case of failure
    }
    return 20; // in case of success
}

所有执行路径必须最终返回一个值(或引发异常)。

【讨论】:

  • 或者在try块的末尾放一个return(对我来说最自然的地方)
  • 所以如果发生错误,那么最后一个块不会执行,因为catch块已经返回了一个值。这是正确的吗?
  • @bbalchev:没有。 finally 块总是执行。这就是 finally 块的全部意义。
  • 好的,谢谢。从棘手的问题中学习总是好的。
  • @vee 你指的是第一个代码sn-p吗?请注意它是如何说“考虑执行路径没有 finally”。它不是用来编译的。它说明了如果没有finally(或其他return 语句),它为什么会失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 2016-03-19
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多