【问题标题】:Running a program consist of try block but without catch or final clauses运行程序由 try 块组成,但没有 catch 或 final 子句
【发布时间】:2016-04-10 05:14:50
【问题描述】:

通常这会产生语法错误。但是在 try-with-resources 语句部分的 oracle tutorial 中,有几个带有 try 块但没有 catchfinally 语句的代码示例。这段代码怎么没有语法错误?

【问题讨论】:

  • 因为它像 Java 7 一样被添加到语言规范中。
  • 您为什么认为它们会导致语法错误?新语法有新规则,有这么神奇吗?
  • 可能性是,方法已经声明抛出异常,try-with-resources (实际上)和try-finally 一样

标签: java exception-handling try-catch


【解决方案1】:

try with resources 块中,添加了一个隐式 finally,其中包含在所有 Closable 实例上调用 close() 方法的代码...

所以,finally 仍然存在于块中。所以它在语法上是正确的。

【讨论】:

  • @Optimuskck new as in Java 7 太老了,不公开支持 ;)
【解决方案2】:

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),它都会被关闭。

在这里阅读更多: https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

引用http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.3.2:

14.20.3.2 扩展的 try-with-resources

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

try ResourceSpecification
    Block
Catches//opt
Finally//opt

由以下对基本 try-with-resources 的翻译给出 语句 (§14.20.3.1) 嵌套在 try-catch 或 try-finally 或 try-catch-finally 语句:

try {
    try ResourceSpecification
        Block
}
Catches//opt
Finally//opt

翻译的效果是把ResourceSpecification “内部” try 语句。这允许扩展的 catch 子句 try-with-resources 语句来捕获由于 自动初始化或关闭任何资源。所以,基本上, 包装器已经实现

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2010-09-24
    • 2018-03-04
    • 1970-01-01
    相关资源
    最近更新 更多