使用finally的java中的异常处理

kau*_*nha 5 java exception-handling exception

public class CheckProg {
    public int math(int i) {
        try {
            int result = i / 0;
       // throw new IOException("in here");
        } catch (Exception e) {
            return 10;
        } finally {
            return 11;
        }
    }
    public static void main(String[] args) {
        CheckProg c1 = new CheckProg();
        int res = c1.math(10);
        System.out.println("Output :" + res);
   }
Run Code Online (Sandbox Code Playgroud)

问:如果我运行上面的代码,我得到的结果为输出:11

为什么?不应该在catch块之前捕获异常并返回吗?

Jon*_*eet 7

不应该在catch块之前捕获异常并返回吗?

被抓,那return语句执行......但随后的返回值由return语句被有效地代替finally块,这将执行是否存在是个例外.

有关所有可能性的详细信息,请参阅JLS 14.20.2.在您的情况下,这是路径:

如果try块的执行由于抛出值V而突然完成,那么有一个选择:

  • 如果V的运行时类型与try语句的任何catch子句的可捕获异常类兼容,则选择第一个(最左边)这样的catch子句.值V分配给所选catch子句的参数,并执行该catch子句的Block.然后有一个选择:

    • 如果catch块正常完成[...被忽略,因为它没有]

    • 如果catch块由于原因R突然完成,则执行finally块.然后有一个选择:

      • 如果finally块正常完成[...被忽略,因为它没有]

      • 如果finally块由于原因S而突然完成,则try语句突然完成,原因S(并且原因R被丢弃).

因此底线是重要的 - "原因S"(在我们的例子中,返回值11)最终成为try语句突然完成的方式.

  • @kaustubhsinha:因为`finally`块*总是*执行 - 这就是它的重点. (3认同)