代码之家  ›  专栏  ›  技术社区  ›  Aliuk

尝试资源关闭顺序

  •  1
  • Aliuk  · 技术社区  · 6 年前

    我正在查看Java中的try with resources示例,了解以下内容:

    try (Connection conn = DriverManager.getConnection(url, user, pwd);
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(query);) {
      ...
    }
    

    所以,结束的顺序是:

    rs.close();
    stmt.close();
    conn.close();
    

    这是完美的,因为一个连接有一个语句,一个语句有一个结果集。

    例1:

    try (FileReader fr = new FileReader(file);
         BufferedReader br = new BufferedReader(fr)) {
      ...
    }
    

    成交顺序为:

    br.close();
    fr.close();
    

    例2:

    try (FileOutputStream fos = new FileOutputStream("testSer.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fs);) {
        ...
    }
    

    成交顺序为:

    oos.close();
    fos.close();
    

    1. 在示例1中,BufferedReader有一个文件读取器。
    2 回复  |  直到 6 年前
        1
  •  5
  •   Andy Turner    6 年前

    顺序是一样的:总是与指定资源的顺序相反。从 JLS

    资源以与初始化时相反的顺序关闭。

    close() 前面指定的资源的方法(如 BufferedReader ObjectOutputStream ),可能看起来它们没有按预期的顺序发生(而且 关闭()

        2
  •  0
  •   Aliuk    6 年前

    我想我说“连接有语句,语句有结果集”是不对的。可能是相反的“一个结果集有一个语句,一个语句有一个连接”,或者至少“一个结果集是由一个语句创建的,一个语句是由一个连接创建的”。

    所以我想:

    try (Parent parent = new Parent();
         Child child = parent.createChild();) {
        ...
    }
    

    try (Parent parent = new Parent();
         Child child = new Child(parent);) {
        ...
    }