为什么"终于"此代码中需要阻止

时间:2014-07-06 22:08:34

标签: java try-catch-finally

我知道创建一个没有的try-catch段是有效的 终于阻止了。因此,在使用此代码进行黑客攻击时,我无法理解 什么java逻辑(例如规则,理论)迫使我包括finally块 在这段代码中 - 以及为什么finally块必须包含一个返回 声明。换句话说,如果我删除了finally 完全阻止我收到错误,如果我替换return语句 在finally块中使用其他任何东西(例如System.out.printl('' foo")),I 仍然收到一个错误,坚持我包含一个return语句。再次, 这里编写的代码编译并运行正常。我只是想了解一下 try-catch-finally构造背后的一点理论(p.s.我理解 它的所有关于"异常处理" ...但我的问题更多的是关于 代码流和返回语句。)

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());
    }
}

1 个答案:

答案 0 :(得分:7)

考虑没有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区块之外返回。

请注意,finally块中的try-catch-finally有一个return语句,该语句将取代catch的{​​{1}}语句,因为return如果执行了关联的finally,则始终执行block。您可能想要使用以下

try[-catch]

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