我有这个带嵌套try的java代码:
try
{
try
{
[ ... ]
{
catch (Exception ex)
{
showLogMessage(ex);
return;
}
while (condition == true)
{
try
{
[ ... ]
{
catch (Exception ex)
{
showLogMessage(ex);
continue;
}
[ ... ]
}
}
catch (NumberFormatException e)
{
showLogMessage(e);
}
finally
{
doSomeThingVeryImportant();
}
我想知道当我得到异常时是否总是执行finally
。我问这个是因为catch块有return
或continue
语句。
doSomeThingVeryImportant()
何时执行?当我获得Exception
时<{1}}
我只想要在执行任何catch块之后,也执行finally块。
答案 0 :(得分:19)
finally块(如果使用的话)放在try块和后面的catch块之后。 finally块包含将运行的代码,无论是否在try块中抛出异常。一般语法如下所示:
public void someMethod{
Try {
// some code
}
Catch(Exception x) {
// some code
}
Catch(ExceptionClass y) {
// some code
}
Finally{
//this code will be executed whether or not an exception
//is thrown or caught
}
}
这里有4种可能的情况:
try块运行到最后,没有例外 抛出。在这种情况下,finally块将是 在try块之后执行。
在try块中抛出异常,即 然后陷入其中一个陷阱。在这种情况下, finally块将在catch块之后立即执行 执行。
在try块中抛出一个异常,就是这样 在方法中没有匹配的catch块可以捕获 例外。在这种情况下,调用方法 结束,并将异常对象抛出到封闭处 方法 - 就像try-catch-finally的方法一样 街区居住。但是,在方法结束之前,最后 阻止执行。
在try块运行完成之前,它返回到 无论何处调用该方法。但是,在它返回之前 对于调用方法,finally块中的代码仍然是 执行。所以,请记住finally块中的代码 即使有回报,也会被执行 在try块的某个地方发表声明。
更新:最后总是执行,无论try或catch块发生什么(失败,返回,异常,完成等)。
答案 1 :(得分:2)
The finally block always executes when the try block exits
(click)。
答案 2 :(得分:2)
The finally block always executes when the try block exits.
This ensures that the finally block is executed even if an unexpected exception occurs
从这里采取:http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
此外,该页面解释了如果在执行try或catch代码时JVM存在,或者执行try / catch的线程被中断或被杀死,则执行finally块may not
。
因此,除非您可以终止JVM或者在一个线程中执行try / catch,否则将始终执行finally块
答案 3 :(得分:2)
是的,最后总是执行。除了例外,没有例外。
这是确保某些部分代码始终执行的方法。
例如,用于处理对象,关闭打开的服务器连接和那种东西。
从oracle检查此链接:
http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
答案 4 :(得分:2)
是的,finally
块总是被执行。
来源:http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
答案 5 :(得分:2)
是;或者,至少尽可能接近“永远”。 (所以,即使您有return
或其他throw
。)
如果您的进程被终止,或者您的程序陷入死锁或无限循环,或者您的设备被流星击中,那么程序流将无法到达finally
块。
答案 6 :(得分:2)
说你的代码块是这样的:
try
{
try
{
System.out.println("first try block");
}
catch (Exception ex)
{
System.out.println("first cathc block");
return;
}
while (true)
{
try
{
System.out.println("second try block...");
}
catch (Exception ex)
{
System.out.println("second catch block");
continue;
}
System.out.println("end of loop");
break;
}
}
catch (NumberFormatException e)
{
System.out.println("last catch block");
}
finally
{
System.out.println("finally block");
}
如果你运行它,那么你将获得的输出是:
first try block
second try block...
end of loop
finally block
所以finally block
无论如何都会被执行。
答案 7 :(得分:0)
是的,最后总是被执行,因为如果出现异常或没有异常,可以编程关闭/处理资源。
http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
更新以回答关于System.exit()
在System.exit()
的情况下,finally块不会执行,除非它因某些SecurityException
而失败。
更改问题后更新。无论异常是什么,最终块总是会执行。
如果是Exception
那么你的catch块将不会执行,因为它只捕获NumberFormatException
答案 8 :(得分:0)
是的,最后总是执行阻止。但条款和条件适用。
除非您致电 System.exit();
,否则直到此为止答案 9 :(得分:0)
不,终于不会总是执行。有两种情况,最终将无法执行。
注意:如果在执行try或catch代码时JVM退出,则finally块可能无法执行。同样,如果执行try或catch代码的线程被中断或终止,则即使整个应用程序仍在继续,finally块也可能无法执行。
对于你的问题,如果这两件事情都不存在,那么无论你的内心是什么,都会被执行,这是肯定的。