Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最后如何使用_Java_Try Catch Finally - Fatal编程技术网

Java 最后如何使用

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

我从未正确理解finally语句的用法。谁能告诉我这两者之间的区别是什么

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);还有更多的例子,我不想列举,我相信已经有了