Java 运行由try块组成但没有catch或final子句的程序
通常这会导致语法错误。但是在inJava 运行由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
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中太旧了,它不受公开支持;)