Mar*_*ijn 37 java try-catch-finally
我从来没有正确理解finally语句的用法.谁能告诉我两者之间的区别是什么:
try {
a;
block;
off;
statements;
} catch (Exception e) {
handle;
exception;
e;
} finally {
do;
some;
cleanup;
}
Run Code Online (Sandbox Code Playgroud)
一方面和:
try {
a;
block;
off;
statements;
} catch (Exception e) {
handle;
exception;
e;
}
do;
some;
cleanup;
Run Code Online (Sandbox Code Playgroud)
在另一
mer*_*ike 36
他们有所不同
try-块抛出一个完成java.lang.Throwable这不是一个java.lang.Exception,例如,因为它是一个java.lang.Error如AssertionError或OutOfMemoryError.continue,break或return更一般地说,java语言保证在try语句完成之前执行finally块.(请注意,如果在try语句没有完成,也没有对最后的保证,语句可能无法完成的原因有多种,包括硬件关机,关闭操作系统,虚拟机停机(例如因System.exit),线程等待(Thread.suspend(),synchronized,Object.wait(),Thread.sleep())或以其他方式被忙碌(无端环,,,,).
因此,一个finally块是比方法体的结束清理工作一个更好的地方,但其本身,仍然不能保证清理exeuction.
YoK*_*YoK 29
finally 块始终执行.
finallyblock用于清理,比如释放try/中使用的资源catch,关闭数据库连接,关闭套接字等等.即使在try/ catchblock中发生未处理的异常时也是如此.
finally块不执行的唯一时间system.exit()是调用try/ catch或发生某些错误而不是异常.
上述描述中的错误意味着Java应用程序退出时出现Out of Memory错误.我看到一些downvotes :(因为这个原因似乎.
Dan*_*Dan 18
主要区别在于该catch部分本身可能抛出异常,突破周围的块,或从当前方法返回.在那种情况下do; some; cleanup;不执行.
使用finally块,可以保证将执行该代码.
Jon*_*eet 11
捕获所有异常基本上是个坏主意 - 所以你需要考虑如果未捕获的异常从try/catch或try/catch/finally块传播出来会发生什么.最后一块可以让你清理出去.
也:
简而言之,如果您希望在离开try/catch块时执行某些代码,但是您要离开它(除了过程非常难以终止),最后是您的朋友.
在正确的编码风格中,您不希望如下所示进行捕获.
try{
[some task]
}
catch
{
}
Run Code Online (Sandbox Code Playgroud)
您想要做的是捕获特定的已知错误.
try{
[some task]
}
catch(Exception ex)
{
if([known execption])
[ignore]
else
throw(ex);
}
[Cleanup]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果再次抛出错误,则不会运行清理代码.因此,即使抛出新错误,我们也会在finally中添加即将运行的内容.
try{
[some task]
}
catch(Exception ex)
{
if([known execption])
[ignore]
else
throw(ex);
}
finally
{
[Cleanup]
}
Run Code Online (Sandbox Code Playgroud)