返回 try-catch 在 java 中的 final 块。这个例子有什么好点吗?

2022-09-01 06:32:19

我不熟悉java,我最近一直在看一些同事写的代码,这让我感到困惑。这是它的要点:

public response newStuff(//random data inside) {
    try {
       response or = //gives it a value
       log.info(or.toString());
       return or;
    }
    catch ( Exception e) {
        e.printStackTrace();
    }
    finally {
        return null;
    }
}

在这里添加一个最终的块真的有意义吗?难道我不能在 catch 块中添加返回 null,这将执行相同的行为,还是我错了?


答案 1

在这里添加一个最终的块真的有意义吗?

这个问题的答案是一个响亮的“不”:在块中放置一个语句是一个非常糟糕的主意。returnfinally

我只是在 catch 块内添加返回 null,这将执行相同的行为,还是我错了?

它与原始行为不匹配,但这是一件好事,因为它可以修复它。而不是像原始代码那样无条件返回,具有块内部的代码将仅在错误时返回。换句话说,除非存在异常,否则分支中返回的值将返回给调用方。nullreturncatchnulltry

此外,如果在块之后添加,您将看到异常返回的正确效果。我会走得更远,在方法中放一个单一,就像这样:return nullcatchnullreturn

response or = null;
try {
   or = //gives it a value
   log.info(or.toString());
} catch ( Exception e) {
    e.printStackTrace();
}
return or;

答案 2

其实不然。最后是(几乎)总是运行,无论结果如何,在尝试捕获块;所以这个块总是返回。在这里,看看这个例子:null

public class Finally {

/**
 * @param args
 */
public static void main(String[] args) {
    System.out.println(finallyTester(true));
    System.out.println(finallyTester(false));
}

public static String finallyTester(boolean succeed) {
    try {
        if(succeed) {
            return "a";
        } else {
            throw new Exception("b");
        }
    } catch(Exception e) {
        return "b";
    } finally {
        return "c";
    }
  }

}

它将两次打印“c”。

上面提到的规则的例外是如果线程本身被中断;例如,通过 .然而,这是一件罕见的事情。System.exit()


推荐