【发布时间】:2013-12-30 13:16:16
【问题描述】:
如果我们在try中给出这样的return语句,执行顺序是什么
try{
--- ----
-----
return a;
}
catch{
}
finally{
}
这里如果try中有return,执行顺序是什么。请告诉我
【问题讨论】:
-
为什么不自己试试呢?这很容易测试。
如果我们在try中给出这样的return语句,执行顺序是什么
try{
--- ----
-----
return a;
}
catch{
}
finally{
}
这里如果try中有return,执行顺序是什么。请告诉我
【问题讨论】:
在对 return 语句求值之后,最后总是被执行。
【讨论】:
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 崩溃..)
System.exit() 的执行方式,但它本质上是内部引发的系统崩溃。可能是关闭任何 Java 应用程序的最肮脏的方式,它似乎无法保证在调用它之后可以完成多少工作,除非你有一个关闭钩子,它非常非常小心地join()ing 你必须完成的任务。我有一个应用程序在调用System.exit(0) 时尚未转储许多兆字节的文件,并且很难或不可能完成它。老实说,最好不要打电话给System.exit()。
joining 必须完成的任务被认为是阻塞陷阱并将被终止;您必须确保您的关闭挂钩实际上自己完成工作。所以我想通了。我仍然认为exit() 是关闭机器的不好方法,如果您有更好的处理方法,应该避免使用它。
无论finally 是什么情况,都会一直执行。
如果try 成功执行,它将不会执行catch 块。如果try 块抛出异常然后catch 块将执行
【讨论】:
通常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 将不会执行。
【讨论】:
如果 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;
}
【讨论】:
在try-catch 处理中,当您return 来自try 块时,它将超出try-catch-finally.. 的范围,因为catch 块只接受try.. 抛出的内容。返回的东西,现在当你从 try 块返回时,它不会到达 try 结束并且最终不会被执行,它将退出 try-catch-finally 块,回到你的代码。
【讨论】: