Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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 最后执行finally块的原因是什么?_Java_Try Catch_Finally - Fatal编程技术网

Java 最后执行finally块的原因是什么?

Java 最后执行finally块的原因是什么?,java,try-catch,finally,Java,Try Catch,Finally,在Java中,为什么存在finally块: try { ... } catch(...) { ... } finally { // instructions lastly executed when the "try" block is quit } 而不是第一个街区 try { ... } firstly { // instructions firstly executed when the "try" block is quit } catch(..

在Java中,为什么存在finally块:

try {
    ...
} catch(...) {
    ...
} finally {
    // instructions lastly executed when the "try" block is quit
}
而不是第一个街区

try {
    ...
} firstly {
    // instructions firstly executed when the "try" block is quit
} catch(...) {
    ...
}
在Java中,为什么存在finally块:

finally块的存在使得无论异常在try或catch中发生在何处,或者根本不发生,它总是被执行。最后是用来放置代码,如关闭文件流、清理代码等

如果您最终不喜欢,那么就可以尝试使用资源。你可能想用这个

在Java中,为什么存在finally块而不是first块

try {
    ...
} firstly {
    // instructions firstly executed when the "try" block is quit
} catch(...) {
    ...
}

顾名思义,finally必须包含清理代码,它不能放在catch之前,也不能先被调用。即使catch块中出现异常,finally中的代码也会执行。

这与

try {
    try {
        ...
    } finally {
        // instructions firstly executed when the outer "try" block is quit
    }
} catch(...) {
    ...
}
这不是一种常见的模式,但如果是,则可以以更惯用的方式支持它。一般来说,finally用于关闭您不再需要的任何资源,并且您不太可能希望在异常处理中阻止对这些资源的访问


唯一的区别是第一个块在catch子句之前执行,而不是像finally块那样在之后执行。因此,例如,它可以在catch阻塞之前正确地关闭资源,而catch阻塞可以执行System.exit


我假设资源的关闭在块的末端而不是在中间是有意义的。

第一块是什么?请详细说明你的第一个块,第一个块实际上不存在,我的问题是它不存在的原因而不是最终的块。你必须解释什么是第一个块。如果它存在的话,block应该会这样做。当try退出时,第一个block的行为与最后一个block完全相同,但是会在catch子句之前而不是之后执行。我恐怕这不是重点。即使在catch子句中引发异常,也会执行第一个块。First块可以包含清理代码,也可以包含finally块。@Qu'est-cet'yon那么finally和First有什么区别呢?唯一的区别是First块在catch子句之前执行,而不是像finally块那样在之后执行。例如,它可以在catch阻塞之前正确地关闭资源,而catch阻塞可以完成一个系统。exit…@Qu'est-cet'yon不幸的是,这不是你要做的。你总是处理一个异常,然后关闭你的资源,而不是反过来。你得到了一分。但是,在catch中不能使用try块中的局部变量。如果它们在外部声明,则它们可能为null,因为异常阻止它们在捕获之前被初始化。此外,资源可能会在尝试创建异常时启动异常,并且无法在捕获中使用。顺便说一句:最后一句应该是一样的:try{try{…}catch…}first{…}。@Qu'est-cet'yon我认为你有一个观点,并且回答了你的问题,但是我认为这样安排是不合乎逻辑的,尽管可能是因为我习惯了这种方式。可能是他们从某种语言中复制了这一功能。谢谢。我给你的答案加了+1,因为它带来了一些答案,尽管它不能完全解决它。我不明白为什么我在这个问题上会得到否定的观点。@Qu'est-cet'yon不明白为什么事情是这样的问题通常没有明确的答案,而且往往会被否决。