为什么最后使用

2022-08-31 22:43:41

我从来没有正确地理解最后陈述的用法。谁能告诉我两者之间有什么区别:

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;

在另一方面


答案 1

它们在以下情况下有所不同:

  • -block 通过抛出一个不是 ,例如,因为它是一个如 或 来完成。tryjava.lang.Throwablejava.lang.Exceptionjava.lang.ErrorAssertionErrorOutOfMemoryError
  • try-block 使用控制流语句(如 、 或continuebreakreturn
  • catch-block 突然完成(通过抛出任何可抛出的,或使用控制流语句)

更一般地说,java语言保证在try语句完成之前执行最终块。(请注意,如果 try 语句未完成,则无法保证 finally。语句可能由于各种原因而无法完成,包括硬件关闭、操作系统关闭、VM 关闭(例如,由于)、线程等待(、、、)或其他繁忙(无限循环、,,,)。System.exitThread.suspend()synchronizedObject.wait()Thread.sleep()

因此,块是比方法体结束更好的清理操作位置,但就其本身而言,仍然不能保证清理执行。finally


答案 2

finally块始终执行。

finallyblock 用于清理,例如释放 /中使用的资源、关闭 db 连接、关闭套接字等。即使 /块中发生未处理的异常。trycatchtrycatch

块不执行的唯一时间是调用 /或发生某些错误而不是异常。finallysystem.exit()trycatch

上述描述中的错误是指当 Java 应用程序退出时出现内存不足错误等情况。我看到一些反对票:(似乎出于这个原因。


推荐