Java 为什么AutoClosable使用try/catch语义?
Java的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 = .
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开发人员可能会过来回答这个问题