当前位置: 首页 > 知识库问答 >
问题:

Java中的try with资源语句

罗新
2023-03-14

在此Java程序示例中:

package test;

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;

public class Test
{
    private static void example(){
        String url = "jdbc:oracle:thin:@//localhost:7856/xe";
        String user = "user";
        String password = "pass";
        try(Connection con = DriverManager.getConnection(url, user, password);
            Statement stmt = con.createStatement()){
            throw new OutOfMemoryError("Error");
        }catch (SQLException e){
            System.err.println("SQLException");
        }
    }

    public static void main(String [] args){
        try{
            example();
        }catch (OutOfMemoryError e){
            System.err.println("OutOfMemoryError");
        }
        // Rest of code here...
    }
}

当在静态方法example()的正文中抛出OutOfMemoryError错误时,在终止静态方法example()之前,连接“con”和语句“stmt”是否会自动关闭,尽管没有任何“cat”捕获这些错误,因此在main()的其余代码中,是否确定这两个对象已关闭?

谢谢

共有1个答案

苏宏逸
2023-03-14

对try with resources构造总是关闭资源,即使它是未经检查的可丢弃资源(如OutOfMemoryError)。

这是在JLS 14.20.3中指定的,它以一个非常通用的语句开始,即资源“自动关闭”,但随后进入了资源关闭的各种示例。基本上,任何非null资源总是关闭的,就好像关闭是在为该资源创建的try最终子句中。即使try中有多个资源,也会出现这种情况,就像您的情况一样(“关闭一个资源的异常不会阻止关闭其他资源”)。

演示它的简单类:

public class Twr {
  private static class TwrCloseable implements AutoCloseable {
    private final String id;

    TwrCloseable(String id) {
      this.id = id;
    }

    @Override
    public void close() {
      System.out.println("closing " + id);
    }
  }

  public static void main(String[] args) {
    try (TwrCloseable closeable1 = new TwrCloseable("first");
         TwrCloseable closeable2 = new TwrCloseable("second")) {
      throw new OutOfMemoryError();
    }
  }
}

输出:

closing second
closing first
Exception in thread "main" java.lang.OutOfMemoryError
    at Twr.main(Twr.java:19)

注意,它们是按相反的顺序关闭的;“second”在“first”之前关闭在您的示例中,这意味着在连接之前关闭语句,这正是您想要的。

 类似资料:
  • 问题内容: 如何将资源(图像)直接添加到我的JAR文件中?例如,如果您打开Minecraft的minecraft.jar,则可以看到一些带有资源的类和文件夹。 如果我尝试将任何资源放在我的/ src文件夹中,Eclipse将在Package Explorer中显示它们,这很烦人。 当我反编译Minecraft(Minecraft Coder Pack)时,/ src文件夹中没有资源。如何像Mine

  • 概览 Android上的Chrome使用了Java代码中的一些资源(例如,Android layout和相关的字符串或图像)。这些资源依照Android的资源目录结构存储于Java根目录内, content/public/android/java/res - Java resources available within content and anything that depends on c

  • 本文向大家介绍如何在Java 9中的try-with-resources语句中声明多个资源?,包括了如何在Java 9中的try-with-resources语句中声明多个资源?的使用技巧和注意事项,需要的朋友参考一下 在Java 9中对try-with-resources语句进行了改进。如果我们已经有一个最终的或等同于最终变量的资源,那么我们可以在try-with-resources语句中使用该

  • 我主罐子里有一些资源包 我根据默认语言环境检索资源包,如下所示 但是,我想向用户提供一个支持的可用语言列表,以便用户可以选择一种可能不同于其默认计算机的语言 但我在ResourceBundle中找不到列出可用区域设置的方法,我不想硬编码一个列表,因为当添加另一个资源包时,我可能会忘记更新它。 编辑 由于我只使用不同语言的资源包(我没有国家细化),所以我通过迭代所有已知语言代码生成了一个列表,并将每

  • 这里列出了 Python 相关的一些资源,欢迎读者补充。 vinta/awesome-python: A curated list of awesome Python frameworks, libraries, software and resources 包含了 Python 框架、Python 库和软件的 awesome 列表。 aosabook/500lines: 500 Lines or