返回try / catch块中的语句Java

时间:2015-04-19 17:09:06

标签: java try-catch

假设我有以下内容:

class NegativeException extends RuntimeException {
}

class ZeroException extends NegativeException {
}

class Driver {
    static boolean Marathon(int a) {
        try {
            if (a < 0)
                throw new NegativeException();
            else if (a == 0)
                throw new ZeroException();
            else if (a >= 42)
                return true;
            else
                return false;
        } catch (ZeroException e) {
            System.out.println("Use natural number");
        } finally {
            System.out.println("One last thing");
        }
        System.out.println("All done.");
        return false;
    }

    public static void main(String[] args) {
        /* One last thing */
        /* true */
        System.out.println(Marathon(100));


        System.out.println(Marathon(0));
        System.out.println(Marathon(-5));

    }
}

我想要了解的是为什么当使用main方法的第一行时,“All done”行没有被执行? Marathon(100)

似乎finally语句执行,然后输出return语句。我知道finally块将始终执行,无论发生什么。但是,我似乎无法理解return语句如何影响try catch块的流。尝试从try-cath-finally块返回时是否有一组适用的规则?

1 个答案:

答案 0 :(得分:4)

  

我想要了解的是为什么当使用main方法的第一行时,“All done”行没有被执行?马拉松(100)

因为a >= 42为真,所以你这样做:

return true;

...立即将控制转移到finally块;在finally块的末尾,该函数返回(没有运行跟随<{em} finally块的任何行)。也就是说,return不仅设置返回值,而且在运行任何未完成的finally块之后终止该点的函数。

如果你想继续执行,你会写一个变量,然后在最后有一个return

static boolean Marathon(int a) {
    boolean rv = false;
    try {
        if (a < 0)
            throw new NegativeException();
        else if (a == 0)
            throw new ZeroException();
        else if (a >= 42)
            rv = true;
    } catch (ZeroException e) {
        System.out.println("Use natural number");
    } finally {
        System.out.println("One last thing");
    }
    System.out.println("All done.");
    return rv;
}

returntrycatch的更多信息:如果您从return内发出try finally块,它立即将控制转移到finally块。当到达该块的末尾时,该函数终止(没有 finally块之后运行任何代码,除非您有嵌套的finally块或类似的)。如果您return内的catch,则会发生同样的事情。

例如:

try {
    if (someCondition) {
        return 1;
    }
    if (someOtherCondition) {
        throw new Exception();
    }
}
catch (Exception e) {
    System.out.println("Got here because of exception");
    return 2;
}
finally {
    System.out.println("Got here");
}
System.out.println("May not have gotten here");
return 3;

"Got here"无论如何都会始终输出;这是finally条款的重点,它们总是被执行。

仅当"Got here because of exception"为真时才输出

someOtherCondition(并且将在"Got here"之前输出),在这种情况下,函数通常返回值1。< / p> 如果"May not have gotten here"someCondition为真,则

someOtherCondition将不会输出,因为returntry中的catch s块。

如果两种情况都不属实,您会看到"May not have gotten here"后跟"Got here",函数会返回3

请注意return块中的catch表示当2为真时,函数返回正常(值为someOtherCondition) ,它不扔。如果您没有returnsomeOtherCondition为真,则会看到"Got here because of exception""Got here",然后该函数将以throw结束(否)完全返回值,并且不会输出"May not have gotten here"

最后但并非最不重要:如果return块中有finally,则return“获胜”:即使您位于finally区块内,你已经发出return,在finally块中取代return取代它,使函数返回finally所说的值,而不是之前的值。