在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
块将被最后调用。 无论是否已完成try
或exception
块被调用。 在这种情况下,无论运行哪个代码path,都将返回null。 在“正常”情况下,如果在finally之后放置return null
,则确实有机会返回(从try
或catch
块中),如果没有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出现或没有。