【发布时间】:2018-06-21 17:12:07
【问题描述】:
Java 的 AutoCloseable 功能“重用”try/catch 语义:
try (Stream x = ...) {
// work with x
}
// x is out of scope and was auto-closed
我很好奇他们为什么没有为这个新功能引入新的语义。 try 暗示您希望主体在某一点或另一点抛出异常(或者它可能)。这对我来说似乎与“实例化这个资源并在我完成后关闭它”有很大不同。这与处理异常没有任何关系。为什么不是这样的......
with (Stream x = ...) { ... }
using (Stream x = ...) { ... } // I know, C# syntax
我不想引发争论,我想知道 Java 团队决定将 try 重新用于此功能的原因。
【问题讨论】:
-
它不重用
try/catch语义,而是try/finally语义。 -
这仍然被认为是题外话,除非其中一位 Java 开发人员可能会过来回答这个非常具体的问题
-
“try 暗示您希望主体在某一时刻抛出异常” - 不,这不再是真的。它被称为
try-with-resource并简单地“重用”try关键字,这很好,因为您可以在同一个结构中处理异常,而不必以某种方式嵌套它们。 -
"// 我知道,C# 语法" - 在这种情况下哀叹 C# 语法有点讽刺。在 C# 中所做的一切只是掩盖了 try/finally 的幕后创建。在这个过程中,重载一个已经用于完全不同的东西(在不同的上下文中)的关键字
using。 Java 只是更多地暴露底层结构,而不是创建或重载不必要的关键字。 -
try-with-resources始终为 translated in to atry-catch-finallyconstruct, even if you don't explicitly write acatchorfinallyyourself。 (如果你确实写了catch或finally块,it's translated in to an outertryblock。)
标签: java java-7 autocloseable