在java中返回try-catch的finally块.这个例子有什么好处吗?

use*_*969 35 java try-catch

我不熟悉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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里添加finally块真的有什么意义吗?我不能只在catch块中添加返回null,这将执行相同的行为,或者我错了吗?

das*_*ght 31

在这里添加finally块真的有什么意义吗?

对此的答案是响亮的"不":returnfinally块中发表声明是一个非常糟糕的主意.

我只是在catch块中添加return null,它会执行相同的行为,或者我错了?

它不符合原始行为,但这是一件好事,因为它会修复它.而不是null像原始代码那样无条件地返回,具有块return内部的代码catchnull仅返回错误.换句话说,try除非存在异常,否则分支中返回的值将返回给调用者.

此外,如果添加return null catch块,你会看到返回的正确作用null于异常.我会更进一步,并return在方法中放一个,如下所示:

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

  • 此外,我补充一点,`response`不遵循命名约定.另外,我强烈反对`catch(Exception e)` (4认同)

bla*_*dri 22

实际上,没有.最后(几乎)总是运行,无论try-catch块中的结果如何; 所以这个块总是返回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";
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

它会两次打印"c".

上述规则的例外情况是线程本身是否被中断; 例如System.exit().然而,这是一件罕见的事情.

  • +1,因为它真实地展示了Netbeans警告"最终块中的返回丢弃未处理的异常" (5认同)

小智 5

finally始终执行不管是什么,通常可以用来关闭会话等,不要把内部的回报finally块.

  • "终于总是执行" - 你试过`System.exit()`?:) (6认同)