Java 运行由try块组成但没有catch或final子句的程序

Java 运行由try块组成但没有catch或final子句的程序,java,exception-handling,try-catch,Java,Exception Handling,Try Catch,通常这会导致语法错误。但是在intry with resources语句部分中,有几个代码示例带有try块,但没有catch或finally语句。为什么这些代码没有给出语法错误 在try with resources块中,添加一个隐式finally,在所有可关闭的实例上调用close()方法 因此,最后仍然存在于块中。因此它在语法上是正确的。try with resources语句是一个try语句,它声明了一个或多个资源。资源是一个必须在程序完成后关闭的对象。try with resources

通常这会导致语法错误。但是在in
try with resources
语句部分中,有几个代码示例带有
try
块,但没有
catch
finally
语句。为什么这些代码没有给出语法错误

try with resources块中,添加一个隐式
finally
,在所有
可关闭的
实例上调用
close()
方法


因此,
最后
仍然存在于块中。因此它在语法上是正确的。

try with resources语句是一个try语句,它声明了一个或多个资源。资源是一个必须在程序完成后关闭的对象。try with resources语句确保在语句末尾关闭每个资源。任何实现java.lang.AutoCloseable的对象(包括实现java.io.Closeable的所有对象)都可以用作资源

下面的示例从文件中读取第一行。它使用BufferedReader实例从文件中读取数据。BufferedReader是程序完成后必须关闭的资源:

static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
               new BufferedReader(new FileReader(path))) {
    return br.readLine();
}
}
在本例中,try with resources语句中声明的资源是BufferedReader。声明语句出现在try关键字后面的括号内。Java SE 7及更高版本中的BufferedReader类实现了接口Java.lang.AutoCloseable。由于BufferedReader实例是在try with resource语句中声明的,因此无论try语句是正常完成还是突然完成(由于BufferedReader.readLine方法引发IOException),它都将关闭

请在此处阅读更多信息:

引自:

14.20.3.2资源的扩展尝试

包含至少一个catch子句和/或 finally子句称为扩展的try with resources语句。这个 扩展的try with resources语句的含义:

try ResourceSpecification
    Block
Catches//opt
Finally//opt
try {
    try ResourceSpecification
        Block
}
Catches//opt
Finally//opt
以下是对参考资料的基本尝试的翻译 嵌套在try-catch或try-finally或 try catch finally语句:

try ResourceSpecification
    Block
Catches//opt
Finally//opt
try {
    try ResourceSpecification
        Block
}
Catches//opt
Finally//opt
翻译的效果就是把资源规范化 try语句的“内部”。这允许使用扩展的catch子句 请尝试使用resources语句捕获由于 自动初始化或关闭任何资源。所以基本上, 包装器已经实现


因为它是像Java7那样添加到语言规范中的。为什么您认为它们会导致语法错误?一个新的语法有新的规则,这很令人惊讶吗?可能是,该方法已声明引发结果异常,try with resources(有效地)与try finally相同@Optimuskck new的可能副本,因为在Java 7中太旧了,它不受公开支持;)