从方法返回,在“try”块中还是在“捕获”块之后?

2022-09-02 04:01:14

以下两种方法有什么区别吗?

哪一个更可取,为什么?

Prg1:

public static boolean test() throws Exception {
    try {
        doSomething();
        return true;
    } catch (Exception e) {
        throw new Exception("No!");
    }    
}

Prg2:

public static boolean test() throws Exception {
    try {
        doSomething();
    } catch (Exception e) {
        throw new Exception("No!");
    }
    return true;    
}

答案 1

请考虑以下未返回常量表达式的情况:

案例1:

public static Val test() throws Exception {
    try {
        return doSomething();
    } catch (Exception e) {
        throw new Exception("No!");
    }
    // Unreachable code goes here
}

案例2:

public static Val test() throws Exception {
    Val toReturn = null;
    try {             
        toReturn = doSomething();
    } catch (Exception e) {
        throw new Exception("No!");
    }
    return toReturn;
}

我更喜欢第一个。第二种更详细,在调试时可能会导致一些混乱。

如果错误地返回 ,并且您看到被初始化为 ,您可能会认为问题出在(特别是当不仅仅是像这样的简单示例时)。test()nulltoReturnnulltest()test()

即使它只能在返回时返回。但这可能很难一目了然地看到。nulldoSomethingnull


然后你可以争辩说,为了保持一致性,最好总是使用第一种形式。


答案 2

不,这两种方法之间没有区别。在这两种情况下,它将通过尽快处理和异常恢复程序流来有效地返回真值。仅当发生异常时,才会访问 Catch。