try-catch-finally 后返回
Posted
技术标签:
【中文标题】try-catch-finally 后返回【英文标题】:try-catch-finally with return after it 【发布时间】:2014-04-27 07:22:41 【问题描述】:我知道 try、catch 和 finally 是如何工作的(大部分情况下),但我想知道一件事:在 try-catch-finally 之后的 return 语句会发生什么,而我们已经在 try 中有 return (或抓住)?
例如:
public boolean someMethod()
boolean finished = false;
try
// do something
return true;
catch(someException e)
// do something
finally
// do something
return finished;
假设尝试没有出错,所以我们返回 true。然后我们会去 finally 我们做一些像关闭一个连接的事情,然后呢?
我们在finally中做了一些事情之后方法会停止(所以方法在try中返回true),还是在finally之后方法继续,导致返回finished(即假)?
提前感谢您的回复。
【问题讨论】:
为什么不能直接执行代码,看看它返回什么值? 因为他在公共汽车上,只是想知道^^ 【参考方案1】:finally 块被执行的事实不会让程序忘记你返回。如果一切顺利,finally块之后的代码就不会被执行。
这是一个清楚的例子:
public class Main
public static void main(String[] args)
System.out.println("Normal: " + testNormal());
System.out.println("Exception: " + testException());
public static int testNormal()
try
// no exception
return 0;
catch (Exception e)
System.out.println("[normal] Exception caught");
finally
System.out.println("[normal] Finally");
System.out.println("[normal] Rest of code");
return -1;
public static int testException()
try
throw new Exception();
catch (Exception e)
System.out.println("[except] Exception caught");
finally
System.out.println("[except] Finally");
System.out.println("[except] Rest of code");
return -1;
输出:
[normal] Finally
Normal: 0
[except] Exception caught
[except] Finally
[except] Rest of code
Exception: -1
【讨论】:
【参考方案2】:如果一切顺利,则在执行finally
块之后执行try
内部的返回。
如果try
内部出现问题,exception
被捕获并执行,然后finally
块被执行,然后执行返回。
【讨论】:
@JqueryLearner 是什么让你认为它无法访问? @JqueryLearner finally 块不是结束。试试看。之后的所有代码都将是完全可访问的。最后什么都不返回。它只是一段在不知道是否有异常的情况下执行的代码。 @JqueryLearner 不过出于不同的原因。将 return 放在 finally 中,并在 tryblock 中放置实际上可能 引发异常的东西。它将编译并运行。 @JqueryLearner 因为你在 finally 块中放了一个 return。这使得之后的一切都无法访问。 @Fildor 是我的错,我认为 OP 在 finally 块中也有 return 语句。所以所有这些讨论都没有用。对不起【参考方案3】:在这种情况下,finally 中的代码会运行,但在没有异常时会跳过另一个返回。 你也可以通过记录一些东西自己看到这一点:)
另请参阅有关System.exit
的内容:
How does Java's System.exit() work with try/catch/finally blocks?
看看从 finally 中返回: Returning from a finally block in Java
【讨论】:
“那个案例”的意思是“没有例外”,而“另一个返回”是 finally 块之后的那个,对吧? (只是为了说清楚) @Fildor 如果出现异常,将使用第二次返回,但仍然执行 finally 块。正如我所说,您可以尝试自己在主程序中的一个小程序中执行此操作,看看 system.out 或日志记录或断点会发生什么 我知道这一点。我刚刚发现您使用的措辞有些模棱两可... @Fildor 是的,我只介绍了这个案例,没有例外,因为我认为这是最有趣的。这是关闭资源的默认 pre Java 7 方式(使用 finally)。 如果我没记错的话,建议不要在 try 中返回,而是设置finished
并让它只返回一个地方。【参考方案4】:
public int Demo1()
try
System.out.println("TRY");
throw new Exception();
catch(Exception e)
System.out.println("CATCH");
finally
System.out.println("FINALLY");
return 0;
调用这个方法的输出是这样的
TRY
CATCH
FINALLY
0
意味着将Trycatchfinally
视为在这种特殊情况下一个接一个执行的语句序列。
然后控制权返回。
【讨论】:
【参考方案5】:try里面的代码肯定会执行..但是当它到达return语句时..它会移动到finally块而不执行try块中的return语句..然后会执行finally的代码然后try 的 return 语句将执行。
【讨论】:
@Narendra11744 没有。如果您不知道结果,请尝试一些代码,但请不要输入错误的答案。如果没有发生异常,在finally块之后,会执行try中的return语句,没有别的。以上是关于try-catch-finally 后返回的主要内容,如果未能解决你的问题,请参考以下文章
C# - Try-Catch-Finally 返回 [重复]
try-catch-finally 中哪个部分可以省略?try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?