Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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_Exception Handling_Try Catch Finally - Fatal编程技术网

Java 为什么不应该';我们不在捕集区清理吗?

Java 为什么不应该';我们不在捕集区清理吗?,java,exception-handling,try-catch-finally,Java,Exception Handling,Try Catch Finally,可能重复: 为什么我们不应该使用catch块来清理代码 我没有太多地使用错误处理技术,但现在我开始在几乎每个程序中使用它们。是时候了 因此,在阅读文章/文档时,我遇到了最后一个障碍 正如它所建议的,finally块运行时不考虑是否存在异常(当然,如果JVM或PC被强制关闭,它不会运行)。最后一个块通常用于清理代码(资源) 所以基本上,如果我的代码没有出现异常,那么我为什么要清理代码呢。我不应该把清理代码放在catch块而不是finally块中吗 我试图寻找类似的问题,但似乎没有人问这个问题。因

可能重复:

为什么我们不应该使用catch块来清理代码

我没有太多地使用错误处理技术,但现在我开始在几乎每个程序中使用它们。是时候了

因此,在阅读文章/文档时,我遇到了最后一个障碍

正如它所建议的,finally块运行时不考虑是否存在异常(当然,如果JVM或PC被强制关闭,它不会运行)。最后一个块通常用于清理代码(资源)

所以基本上,如果我的代码没有出现异常,那么我为什么要清理代码呢。我不应该把清理代码放在catch块而不是finally块中吗


我试图寻找类似的问题,但似乎没有人问这个问题。因此我继续创建了一个问题:D

,因为不能保证执行
catch
块。
finally
块确实有这样的保证,除非你把电源线踢出墙。

正如@RobertHarvey所指出的那样,
catch
块不能保证执行,因此
finally
块是为了避免使用这种代码来让代码更清晰:

    try
    {
        // do something
    }
    catch(Exception e)
    {
        // error handling
        // clean up
    }
    // clean up
所以你可以这样做:

    try
    {
        // do something        
    }
    catch(Exception e)
    {
        // error handling
    }
    finally
    {
        // clean up
    }

如果您想要执行第一个代码,
finally
块将帮助您,例如,如果您有异常或没有异常,您想要清理(例如关闭文件),如果您只想在发生错误时清理,
可以在catch块中清理。

一个典型的例子是文件资源,无论是否遇到异常,都需要关闭它。@DNA这是一个VB.NET问题。或数据库连接。无论是否出现异常,都应始终释放数据库连接。异常也不是唯一需要清理的时间。例如,如果您正在从inputstream读取数据,则无论是否发生异常,您都会希望关闭该流,因此将其放入finally块可以保证它将被调用。@Robert Harvey多么尴尬啊!显然我该睡觉了。但是再看一次,我不确定这在这种情况下有多重要-概念和推理是相同的。或者你调用
System.exit()
。。。或者你的CPU…或者如果地球被外星人摧毁了。但是如果清理代码干扰了我的代码,那么会怎样呢?在这种情况下,我希望它只在捕获异常时运行。我放置了一个标志,如果发生异常,该标志将设置为true。这种做法不好吗?因为这与在catch块中设置清理代码不一样。当代码“举手”并说“发生了不好的事情;我不知道现在该做什么,所以我要抛出”时,会发生异常。你可以决定处理它,或者重新抛出,或者简单地允许异常进入调用堆栈并让其他人处理它。在这些情况下,您必须假设即将清理的对象处于无效状态,或者您可以在
捕获
中尝试其他操作。直到
catch
中的代码完成执行,才能执行
finally
,这样您就有时间完成工作,不管是什么。