try,catch和finally的执行顺序是啥[重复]
Posted
技术标签:
【中文标题】try,catch和finally的执行顺序是啥[重复]【英文标题】:What is the order of execution in try,catch and finally [duplicate]try,catch和finally的执行顺序是什么[重复] 【发布时间】:2013-12-30 13:16:16 【问题描述】:如果我们在try中给出这样的return语句,执行顺序是什么
try
--- ----
-----
return a;
catch
finally
这里如果try中有return,执行顺序是什么。请告诉我
【问题讨论】:
为什么不自己试试呢?这很容易测试。 【参考方案1】:在对 return 语句求值之后,最后总是被执行。
【讨论】:
嗯,return 语句中的表达式仍然会在finally
子句之前进行计算。【参考方案2】:
http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2
finally
总是执行。如果try
中有return
,则try
和catch
的其余部分不执行,则finally
执行(从最里面到最外面),然后函数退出。
【讨论】:
不准确。如果System.exit()
被调用或 JVM 崩溃,finally
将不会被执行..
是的,如果您将计算机从墙上拔下,它也不会执行。也是同样的情况,没必要出线。
@Widdershins 或者如果恐龙会吃掉你的机器。但是调用System.exit()
是您应该注意的情况。 (我同意 JVM 崩溃..)
@Maroun Maroun 是的,尽管老实说 System.exit()
的执行方式,但它本质上是内部引发的系统崩溃。可能是关闭任何 Java 应用程序的最肮脏的方式,它似乎无法保证在调用它之后可以完成多少工作,除非你有一个关闭钩子,它非常非常小心地join()
ing 你必须完成的任务。我有一个应用程序在调用System.exit(0)
时尚未转储许多兆字节的文件,并且很难或不可能完成它。老实说,最好不要打电话给System.exit()
。
@Maroun Maroun 看起来像关闭钩子join
ing 必须完成的任务被认为是阻塞陷阱并将被终止;您必须确保您的关闭挂钩实际上自己完成工作。所以我想通了。我仍然认为exit()
是关闭机器的不好方法,如果您有更好的处理方法,应该避免使用它。【参考方案3】:
无论finally
是什么情况,都会一直执行。
如果try
成功执行,它将不会执行catch
块。如果try
块抛出异常然后catch
块将执行
【讨论】:
【参考方案4】:通常try-catch-finally
的顺序执行顺序首先是try
,然后如果exception
trows and catched will execute
the catch
.无论是否捕获到异常finally
将始终执行。
如果return
在您的try
中,则在try
中的执行将停止并执行finally
。如果exception
在return
之前抛出并捕获,则将遵循正常的执行顺序。
让我们运行以下代码
public static void main(String[] args)
String[] arr=getInfo();
for(String i:arr)
System.out.println(i);
public static String[] getInfo()
String[] arr=new String[3];
try
arr[0]="try";
return arr;
catch (Exception e)
arr[1]="catch";
return arr;
finally
arr[2]="finally";
return arr;
输出
try // return in try
null
finally // returning value in finally.
现在这个输出解释了你想要的每一件事。 finally
在try
中有return
时运行。
如果你的try
中有System.exit(0)
,finally
将不会执行。
【讨论】:
您在设置数组的值时指定顺序,很自然,这就是顺序【参考方案5】:如果 try 中有返回,则控制将转到 finally 块,执行当前代码然后退出。因此在此期间,如果在 finally 块中,try 中返回的任何变量都有任何变化,如果在 finally 中返回相同的变量,则将返回最新的。
try
i = 11;
return i;
catch (Exception e)
// TODO: handle exception
finally
i = 12;
return i; --> This will be returned
//return i;
但是如果只有修改,finally中没有rerun,try中返回的值就是最终值。
try
i = 11; --> this will be returned
return i;
catch (Exception e)
// TODO: handle exception
finally
i = 12; -- this will be executed
//return i;
【讨论】:
【参考方案6】:在try-catch
处理中,当您return
来自try
块时,它将超出try-catch-finally
.. 的范围,因为catch 块只接受try
.. 抛出的内容。返回的东西,现在当你从 try 块返回时,它不会到达 try 结束并且最终不会被执行,它将退出 try-catch-finally
块,回到你的代码。
【讨论】:
以上是关于try,catch和finally的执行顺序是啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章
try-catch-finallyjava异常捕获的三种格式以及finally和return的执行顺序