我介绍了一个我想编写代码的案例:
try {
something();
return success;
}
catch (Exception e) {
return failure;
}
finally {
System.out.println("i don't know if this will get printed out.");
}
(来自Does finally always execute in Java?)
我的问题是:
finally
总是在方法完成之前执行,还是在额外的thread
中运行(因为该方法已经完成了对象的返回)?
换句话说:是否保证在main方法继续之前最终执行?
答案 0 :(得分:4)
所有事情都发生在同一个线程中,只有顺序与程序顺序不同:
return x
仅在x
被确定为返回值的部分执行; finally
阻止执行; finally
块执行自己的return
语句/抛出异常。答案 1 :(得分:1)
简短的回答是,这是方法的一部分。
即使在return
执行finally
之后。
当try块退出时,finally块始终执行。
为什么?
这确保即使发生意外异常也会执行finally块。
澄清你的怀疑。让我们检查下面的代码(仅供测试,不是一个好的做法)。
ry {
something();
return success;
}
catch (Exception e) {
return failure;
}
finally {
System.out.println("i don't know if this will get printed out.");
return success; //method returns this
}
现在该方法返回finally
中的值答案 2 :(得分:0)
如果执行try或catch代码的线程被中断或终止,则即使整个应用程序继续执行,finally块也可能无法执行。
答案 3 :(得分:0)
对于try-finally
或try-catch-finally
:finally子句确保在try块和任何可能执行的catch块之后执行finally块,无论控制如何离开try块或catch块。
但是,在使用return
语句返回值时:
try
和catch
块的返回值return
语句。finally
块没有return语句,则执行finally
块后:
catch
块捕获:记住返回try
块的返回值。catch
块的返回值。 否则,它将使用finally块的return语句返回值,忘记try
和(或)catch
块的返回。
public static Integer returnData()
{
Integer x = null;
try{
System.out.println("try the x: "+x);
return x;
}
finally
{
x = 5; // here i am assigning 5
System.out.println("finally is printed with: "+x); // printing 5
return x;
}
}
public static void main(String[] args) {
System.out.println("Printing the return value in main: "+returnData());
// printed 5 according to the assignment in finally block
}
即使上述函数应该在null
块中返回try
,您也会看到运行上面的示例将会打印出来:
try the x: null
Hi finally is printed with: 5
Printing the return value in main: 5
现在,如果从finally
块中删除return语句,您将看到以下输出:
try the x: null
finally is printed with: 5
Printing the return value in main: null
null
被记为try
区块的返回值。
查看jls: 14.20.2. Execution of try-finally and try-catch-finally了解详情。