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

我不熟悉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; } } 

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

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

答案是一个响亮的“否”:在finally块中放置一个return语句是一个非常糟糕的主意。

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

它不符合原来的行为,但这是一件好事,因为它会解决它。 catch代码中return的代码只会返回null ,而不是以原始代码的方式无条件地返回null 。 换句话说, try分支中返回的值将被返回给调用者,除非有exception。

而且,如果在catch之后添加return null ,则会看到在exception时返回null的正确效果。 我会更进一步,并在这个方法中投入一个单一的return ,就像这样:

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

其实没有 最后(几乎)总是运行,不pipetry-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"; } } } 

它会同时打印“c”。

上述规则的例外是线程本身中断。 例如通过System.exit() 。 然而,这是一个罕见的事情发生。

finally总是被执行,不pipe怎么样,通常可以用来closures会话等等。不要把finally函数放在finally块里面。

这看起来是一个非常糟糕的做法。 在这种情况下,你的代码将总是返回null

try-catch块运行后, finally块将被最后调用。 无论是否已完成tryexception块被调用。 在这种情况下,无论运行哪个代码path,都将返回null。 在“正常”情况下,如果在finally之后放置return null ,则确实有机会返回(从trycatch块中),如果没有stream产生返回对象,则return null ,但是你并不总是返回null。

我读过很多人只是回答“不要在最后一块使用return ”,没有任何解释。 那么,实际上你发布的代码是一个很好的例子,在finally块中的return引起了巨大的混淆。 即使是写这篇文章的时候, 最有回报的答案 也是错的 。 您的代码将始终执行return null; 作为最后的命令, 即使有一个exception 。

但是我可以想象一个情况,在一个finally块中的return实际上是有意义的。 在我看来,你的代码的作者的目标是该方法从不抛出一个Throwable ,而是返回null 。 这实际上可以实现,如果你修改这样的代码:

 public Result newStuff() { Result res = null; try { res = someMethod(); log.info(res.toString()); } catch (Exception e) { e.printStackTrace(); } finally { return res; } } 

但是请注意,这不会调用Error s和Throwable上的printStackTrace() ,它们不是Exception

无论“Catch”是否触发,“Finally”块都会执行。 所以这个行为与在Catch块中放置“return null”的行为是不同的。

在finally块中不应该有return语句,remove return

finally块的需求是当你有这样一个代码,应该总是像你想要closures你的inputstream,或者你想closures任何连接等。只是search了这个,你会很容易find这个例子。

在你的情况下,你正在写一个方法,你在try块中返回一些东西,最后你写finally块在哪里返回null.I没有看到任何使用finally块在这里。

如果你想执行一些语句,即使try块或catch块中的代码产生一个exception,最后使用block。 但是,当你在try块中使用return的时候,在finally块中放置return是没有意义的。 你可以直接从catch块返回,最后可以删除block。

首先明白为什么我们需要用简单的三个方块来初学者。

1)尝试阻止:如果您怀疑您的代码将导致exception,请将其放入try块

2)catch块:如果出现exception,那么你需要执行的一段代码应该写在这个块中

3)最后阻止:如果你想要你的代码块被执行,如果exception出现或没有,那么我们终于阻止。 主要是这个块用于释放资源。 例如:

 try{ Connection conn=//something; //some code for database operations }catch(SQLException e){ e.printStackTrace() }finally{ conn=null; } 

不pipe是什么结果,你必须使连接为空,因为它是重的对象,如果引用将创build数据库的负载,因为只有less数连接对象可用。 因此,最好的方法是最终阻止他们。

在你的情况下,在finally块中返回null是不好的方法,因为它总是会返回null,尽pipeexception出现或没有。