Java 为什么AutoClosable使用try/catch语义?

Java 为什么AutoClosable使用try/catch语义?,java,java-7,autocloseable,Java,Java 7,Autocloseable,Java的AutoCloseable功能“重用”try/catch语义: try (Stream x = ...) { // work with x } // x is out of scope and was auto-closed 我很好奇为什么他们没有为这个新特性引入新的语义try意味着您希望主体在某一点或另一点抛出异常(或者它可能会抛出异常)。对我来说,这似乎与“实例化此资源并在完成后关闭它”大不相同。这与处理异常无关。为什么不做这样的事 with (Stream x = .

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

Java总是尽最大努力实现向后兼容。这是当今语言中几乎所有怪异或不幸方面的原因,但引入一个新的关键字,如
with
using
并不是一个轻率的决定。如果他们使用引入了一个新的关键字
,那么像
int-using=0
这样的旧代码将无法针对最新版本的Java进行编译*

try with resources的引入基本上是为了减少以下常见模式的冗长性:

SomeResource resource;
try {
    resource = new Resource();
    resource.foo();
}
//optional catch
finally {
    if (resource != null) resource.close();
}
因为
try
之前就已经涉及到了,所以在
try
中添加额外的功能是合乎逻辑的快乐媒介


*有趣的是,也有类似的讨论,它实际上不是一个关键字,而是一个“保留类型名”(因此语义略有不同):

风险:源不兼容(可能有人使用var作为类型 姓名。)


Java总是尽力做到向后兼容。这是当今语言中几乎所有怪异或不幸方面的原因,但引入一个新的关键字,如
with
using
并不是一个轻率的决定。如果他们使用
引入了一个新的关键字
,那么像
int-using=0
这样的旧代码将无法针对最新版本的Java进行编译*

try with resources的引入基本上是为了减少以下常见模式的冗长性:

SomeResource resource;
try {
    resource = new Resource();
    resource.foo();
}
//optional catch
finally {
    if (resource != null) resource.close();
}
因为
try
之前就已经涉及到了,所以在
try
中添加额外的功能是合乎逻辑的快乐媒介


*有趣的是,也有类似的讨论,它实际上不是一个关键字,而是一个“保留类型名”(因此语义略有不同):

风险:源不兼容(可能有人使用var作为类型 姓名。)


部分问题是关于Java语言中的设计选择。由于问题的性质,这个答案只是问题的部分答案

不重用-concept,而是使用
try
-concept。虽然很少见到,
try finally
有它的用途。例如,您可以在
finally
-block.1中进行一些清理,而不是显式捕获异常并重新抛出它

的性质非常适合这个用例:打开一个
AutoCloseable
资源,做一些事情,最后关闭它,不管发生什么

有人可能会说,通过
try
开始这个过程似乎是人为的。然而,这是语言委员会的设计决定,因此不值得讨论。如果让我猜的话,我会说他们不想引入一个新的关键字来保持向后兼容



1我知道一个事实,那就是。然而,在我看来,这是一个实现细节,是一个指定行为的工具。对于理解语义来说,这不是必需的。

问题部分与Java语言中的设计选择有关。由于问题的性质,这个答案只是问题的部分答案

不重用-concept,而是使用
try
-concept。虽然很少见到,
try finally
有它的用途。例如,您可以在
finally
-block.1中进行一些清理,而不是显式捕获异常并重新抛出它

的性质非常适合这个用例:打开一个
AutoCloseable
资源,做一些事情,最后关闭它,不管发生什么

有人可能会说,通过
try
开始这个过程似乎是人为的。然而,这是语言委员会的设计决定,因此不值得讨论。如果让我猜的话,我会说他们不想引入一个新的关键字来保持向后兼容



1我知道一个事实,那就是。然而,在我看来,这是一个实现细节,是一个指定行为的工具。对于理解语义来说,它不是必需的。

它不重用
try/catch
语义,而是
try/finally
语义。这仍然被认为是离题的,除非某个java开发人员可能会过来回答这个非常具体的问题“try意味着您希望主体在某一点上抛出异常”-不,这已不再是事实。它被调用并简单地“重用”了
try
关键字,这很好,因为您可以在同一个构造中处理异常,而不必以某种方式嵌套它们。“//我知道,C#syntax”-在这种情况下哀叹C#语法有点讽刺意味。在C#中所做的只是掩盖了try/finally的幕后创作。在重载一个关键字的过程中,该关键字已经用于完全不同的内容(在不同的上下文中),
使用
。Java只是稍微公开了底层结构,而不是创建或重载不必要的关键字。
try with resources
总是这样。(如果您确实编写了
catch
finally
块,)它不会重用
try/catch
语义,而是
try/finally
语义。这仍然被认为是离题的,除非某个java开发人员可能会过来回答这个问题