返回try catch';在java中,最后是块。这个例子有什么好处吗?
我不熟悉java,最近我一直在看一些同事编写的代码,这让我感到困惑。以下是它的要点:返回try catch';在java中,最后是块。这个例子有什么好处吗?,java,try-catch,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
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块中添加return null,这将执行相同的行为,还是我错了?无论发生什么情况,
最终都会执行,并且通常可以用于关闭会话等。
不要将回报放在finally块中。这看起来是一种非常糟糕的做法。在这种情况下,代码将始终返回null
finally
块在try catch
块运行后最后调用。无论是try
完成还是调用了exception
块。在这种情况下,无论运行哪条代码路径,都将始终返回null。
在“正常”情况下,如果将返回null
放在finally之后,则确实有机会返回某些内容(无论是从try
还是从catch
块),如果没有流生成返回对象,则返回到返回null
,但并不总是返回null。finally无论“捕获”是否触发,块都将执行。因此,这种行为与在Catch块中放置“returnnull”不同
在这里添加finally块真的有意义吗
答案是响亮的“否”:在finally
块中放入return
语句是一个非常糟糕的主意
我只是在catch块中添加了returnnull,这将执行相同的行为,还是我错了
它与原始行为不匹配,但这是一件好事,因为它可以修复它。与原始代码那样无条件返回null
不同,在catch
块中带有return
的代码只会在出现错误时返回null
。换句话说,try
分支中返回的值将返回给调用方,除非出现异常
此外,如果在catch
块之后添加returnnull
,您将看到异常时返回null
的正确效果。我会更进一步,在方法中添加一个return
,如下所示:
response or = null;
try {
or = //gives it a value
log.info(or.toString());
} catch ( Exception e) {
e.printStackTrace();
}
return or;
public Result newStuff() {
Result res = null;
try {
res = someMethod();
log.info(res.toString());
}
catch (Exception e) {
e.printStackTrace();
}
finally {
return res;
}
}
finally块中不应有return
语句,删除return
最终块的需要是,当您有这样一个代码时,应该始终执行它,比如您想要关闭输入流或您想要关闭任何连接等。只要在谷歌上搜索一下,您就会很容易找到这方面的示例
在您的例子中,您正在编写一个方法,其中在try块中返回某些内容,最后在finally块中返回null。我在这里看不到finally块的任何用途。实际上,没有。finally(几乎)总是运行,无论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";
}
}
}
它将两次打印“c”
上述规则的例外情况是线程本身被中断;e、 g.通过System.exit()
。然而,这种情况很少发生。如果要执行某些语句,即使try块或catch块中的代码是否生成异常,也可以使用Finally块。但当您在try块中使用return时,将return放在finally块中并没有任何意义。您可以直接从catch block返回,并可以删除finally block。首先了解为什么初学者需要这三个块
1) try block:如果您怀疑您的代码是否会导致异常,请将其放入try block
2) catch块:若出现异常,那个么需要执行的一段代码应该写在这个块中
3) finally block:如果您希望您的代码段被执行,不管是否出现异常,那么我们选择finally block。此块主要用于释放资源。
例如:
try{
Connection conn=//something;
//some code for database operations
}catch(SQLException e){
e.printStackTrace()
}finally{
conn=null;
}
无论结果如何,您都必须将连接设为null,因为它是一个重对象,若被引用,将在数据库上创建负载,因为只有很少的连接对象可用。
所以,最好的办法是让他们在最后块
在您的情况下,在finally块中返回null是一种不好的方法,因为它总是返回null,尽管是否出现异常。我读到很多人只是简单地回答“不要在finally块中使用返回”
,没有任何解释。实际上,您发布的代码是一个很好的例子,其中finally
块中的返回导致了大量混乱。甚至在撰写本文时,也弄错了。您的代码将始终执行返回null代码>作为最后一个命令
但是我可以想到一种情况,在finally
块中的返回实际上是有意义的。在我看来,代码作者的目标是方法从不抛出Throwable
,而是返回null
。如果您这样修改代码,实际上可以实现这一点:
response or = null;
try {
or = //gives it a value
log.info(or.toString());
} catch ( Exception e) {
e.printStackTrace();
}
return or;
public Result newStuff() {
Result res = null;
try {
res = someMethod();
log.info(res.toString());
}
catch (Exception e) {
e.printStackTrace();
}
finally {
return res;
}
}
但是请注意,这不会调用printStackTrace()
对Error
s和Throwable
s,它们不是Exception
s。哦,不要将return
语句放在finally
块中。请。您的代码将始终返回null
。将return
放入catch
与将其放入finally
@nhgrif finally始终执行,无论您是否捕获到期望。这个方法不经过最后一步就无法返回,我很奇怪Java、JavaScript、Python的设计者,