如果我们在try中给出这样的返回语句,那么执行的顺序是什么
1 2 3 4 5 6 7 8 9 10
| try{
--- ----
-----
return a;
}
catch{
}
finally{
} |
这里是什么样的执行顺序,如果有回报在尝试。请告诉我
- 你为什么不自己试试呢?这是微不足道的测试。
- @格罗德里格斯谢谢
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。
- 是的,如果你把电脑从墙上拔掉,它也不会执行。这是同一种情况,不需要资格认证。
- @或者恐龙会吃掉你的机器。但是调用System.exit()是一个你应该注意的情况。(我同意JVM崩溃…)
- @Maroun Maroun是的,虽然诚实地说System.exit()的表现,但它本质上是由内部引起的系统崩溃。可能是关闭任何Java应用程序的最肮脏的方法,它似乎不能保证调用后可以完成多少操作,除非您有一个非常非常谨慎的Edcx1·5对您必须完成的任务的关闭钩子。我有一个应用程序在调用System.exit(0)时还没有将许多兆字节转储到文件中,而且很难或不可能完成它。老实说,最好不要打电话给System.exit()。
- @Maroun Maroun看起来像关机挂钩joining must complete tasks is considered as blocking trapped and will be terminated;您必须确保关机挂钩实际上自己完成工作。所以我想出来了。我仍然认为exit()是关闭机器的一个坏方法,如果你有更好的方法来处理它,应该避免。
首先,你需要去获取文档并正确理解这个概念,你可以参考这些文档。
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
在StackOverflow上,没有人应该解释,因为这个站点基本上不是一个完整的目的。
在try-catch的处理中,当你从try块来的return东西,它将超出try-catch-finally的范围。因为catch块只接受try抛出的内容。不是返回的内容,现在当您从try块返回时,它不会到达try端,最终不会被执行,它将退出try-catch-finally块,返回到您的代码。
如果try中有返回,则控件将转到finally块,执行存在的代码,然后退出。因此,在此期间,如果finally块中对try中返回的变量有任何更改,并且如果finally中返回相同的变量,则返回最新的变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| try {
i = 11;
return i ;
} catch (Exception e ) {
// TODO: handle exception
} finally{
i = 12;
return i ; --> This will be returned
}
//return i;
} |
但是如果只有修改,最终没有重试,那么在try中返回的值将是最终值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| try {
i = 11; --> this will be returned
return i ;
} catch (Exception e ) {
// TODO: handle exception
} finally{
i = 12; -- this will be executed
}
//return i;
} |
。
通常情况下,try-catch-finally的命令执行命令是先执行try,然后如果exception特洛伊并被抓获,execute将执行catch。如果捕获异常或未捕获异常,则始终执行finally。
如果你的try中有return,那么try中的执行将在那里停止,并将执行finally。如果exception在该return之前抛出并捕获,那么将遵循正常的执行命令。
让我们运行以下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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 ;
}
} |
输出
1 2 3
| try // return in try
null
finally // returning value in finally. |
号
现在这个输出解释你想要的每件事。finally运行,而try中有return运行。
如果你的try中有System.exit(0),finally将不会执行。
- 当您自然地设置数组的值时,您指定的是顺序,这就是顺序
无论情况如何,finally将始终执行。如果成功执行try块,则不会执行catch块。如果try块抛出异常,那么catch块将执行
在对返回语句进行评估之后,始终执行finally。
- 那么,返回语句中的表达式仍将在finally子句之前进行计算。