2016-06-26 32 views
-4

在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(...) { 
    ... 
} 
+1

什么是'first'块? – tkausl

+1

请详细说明你的“第一个”块 –

+0

“第一个”块实际上不存在,我的问题是关于它不存在而不是“finally”块的原因。 – Codoscope

回答

0

在Java中,为什么用“终于”块存在:

一个finally块的存在使得它(在trycatch始终执行无论身在何处Exception发生或根本不发生)。 finally是用来放置代码,如关闭文件流,清理代码等...

如果你不喜欢finally,那么有try资源。你可能想要使用它。

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

,顾名思义finally必须包含清理代码,它不能catch前放置和被调用一些花哨firstly。即使在catch块中引发了Exception,也会执行finally中的代码。

+0

恐怕那不是重点。即使在catch子句中引发异常,也会执行第一个块。第一个块可以包含清理代码以及最后一个。 – Codoscope

+0

@ Qu'est-cet'yont那么'finally'与'first'有什么不同呢? –

+0

唯一的区别是第一个块在catch子句之前执行,而不是在finally块之后执行。因此,例如,它可以正确关闭资源,在catch块(可以做一个System.exit ...)之前。 – Codoscope

1

这将是一样

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

这不是一个常见的模式,但如果是,它可以在一个更地道的方式予以支持。一般而言,finally用于关闭您不再需要的任何资源,并且您不太可能不希望在异常处理中阻止访问这些资源。

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

我认为资源的关闭更有意义放置在块的末尾而不是中间。

+1

你明白了。但是,try块中的局部变量不能在catch中使用。如果它们在外部声明,它们可能为空(因为异常阻止它们在捕获之前被初始化)。此外,资源可能会尝试创建一个异常并且不能用于捕获。顺便说一句:最后会是一样的:'尝试{尝试{...}赶上...}首先{...}'。 – Codoscope

+0

@ Qu'est-cet'yont我认为你有一个观点并且已经提出了你的问题,但我认为这样做并不合逻辑,尽管这可能是因为我按照原样使用。可能它以某种他们从中复制功能的语言以这种方式工作。 –

+0

谢谢。我给你的答案+1,因为它带来了一些答案(尽管它没有完全解决)。我不明白为什么我会在这个问题上得到负面评价。 – Codoscope

相关问题