Java 最后如何使用
我从未正确理解finally语句的用法。谁能告诉我这两者之间的区别是什么Java 最后如何使用,java,try-catch-finally,Java,Try Catch Finally,我从未正确理解finally语句的用法。谁能告诉我这两者之间的区别是什么 try { a; block; off; statements; } catch (Exception e) { handle; exception; e; } finally { do; some; cleanup; } 一方面,而且: try { a; block; off; statements; } c
try {
a;
block;
off;
statements;
} catch (Exception e) {
handle;
exception;
e;
} finally {
do;
some;
cleanup;
}
一方面,而且:
try {
a;
block;
off;
statements;
} catch (Exception e) {
handle;
exception;
e;
}
do;
some;
cleanup;
另一方面在正确的编码风格中,您不希望像下面这样做
try{
[some task]
}
catch
{
}
您要做的是捕获特定的已知错误
try{
[some task]
}
catch(Exception ex)
{
if([known execption])
[ignore]
else
throw(ex);
}
[Cleanup]
在这种情况下,如果再次抛出错误,则不会运行清理代码。因此,我们添加了finally,即使抛出新错误,它也会运行
try{
[some task]
}
catch(Exception ex)
{
if([known execption])
[ignore]
else
throw(ex);
}
finally
{
[Cleanup]
}
最后
块始终执行
最后
块用于清理,如释放try
/catch
中使用的资源、关闭数据库连接、关闭套接字等。。即使在块中发生未处理的异常,也要尝试/捕获
finally
块不执行的唯一时间是在try
/catch
中调用system.exit()
时,或者发生一些错误而不是异常
上面描述中的错误表示Java应用程序退出时出现内存不足错误等情况。我看到一些反对票:(出于这个原因,主要区别在于catch
部分本身可能会抛出异常、打破周围的块或从当前方法返回。在这种情况下,do;some;cleanup;
不会执行
使用<代码>最后< /Code >块,保证代码将被执行。
捕获所有异常基本上是个坏主意。因此,您需要考虑如果一个未被清除的异常从您的尝试/捕获或尝试/捕获/最终块中传播出来,将会发生什么。最后,块允许您在退出的过程中清理。
此外:
- catch块可能引发异常
- 您可能希望从try块返回
简言之,如果您希望在离开try/catch块时执行某些代码,而不管您是如何离开它的(除了非常艰难地终止进程之外),finally就是您的朋友。finally块将始终执行
在第二个示例中,如果catch块重新引发异常,或者try块中发生未捕获的异常,则不会进行清理。来自GeekInterview论坛:
当try块退出时,finally块始终执行。这确保了即使发生意外异常,finally块也会执行。但是finally不仅仅用于异常处理,它允许程序员避免清理代码被返回、继续或中断意外绕过。将清理代码放入最后,阻塞始终是一种良好的实践,即使在没有预期异常的情况下也是如此
简单地解释一下:
无论是否捕获到异常,都将执行finally
块中的代码
您在这里给出的两个片段之间的区别是:如果不使用finally
的片段中的代码将永远不会执行
要正确理解finally
,您需要知道的是finally
=保证
您可以使用它来清理、帮助用户友好性或重试某些操作在第一个示例中,即使您在try子句中有一个return语句,finally块也始终会被执行。只有当您有System.exit(0)时,它才不会被执行。如果
try
-块通过抛出一个不是java.lang.Exception
的java.lang.Throwable
来完成,例如,因为它是java.lang.Error
,例如AssertionError
或OutOfMemoryError
- try块使用控制流语句突然完成,如
continue
、break
或return
- catch块突然完成(通过抛出任何throwable或使用控制流语句)
更一般地说,java语言保证在try语句完成之前执行finally块。(注意,如果try语句未完成,则无法保证finally。由于各种原因,语句可能无法完成,包括硬件关闭、OS关闭、VM关闭(例如,由于System.exit
),线程正在等待(thread.suspend()
,synchronized
,Object.wait()
,thread.sleep()
)或正处于繁忙状态(无休止的循环,,,)
因此,finally
块比方法体的末尾更适合执行清理操作,但其本身仍然不能保证执行清理。最终保证执行吗?是的,在System.exit()的情况下不是,这是真的。或者,你知道,JVM崩溃……或者死锁,或者…-真正的规则是:当try-(catch)-finally语句完成时/如果try-(catch)-finally语句完成,finally块保证已经执行。还有许多其他条件没有执行finally,c.f.我的答案(并不是说给出了所有条件…)有很多情况下finally没有被执行(c.f.我的答案),但是抛出异常(或使用控制流语句)是正确的更正:抛出java.lang.Error时会执行finally块。它可能不会成功执行,但确实会执行。此外,还有一些其他条件可能会阻碍finally块的执行,请参阅我的答案以了解不完整的列表。注意:如果JVM在执行try或catch代码时退出,则finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或终止,即使整个应用程序继续运行,finally块也可能不会执行。-这确实很旧,但不能保证finally会执行。快速示例是System.exit(0);还有更多的例子,我不想列举,我相信已经有了