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

catch块和资源关闭的实际工作顺序是什么?

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

    Oracle Java documentation on try-with-resources 有以下内容:

    try with resources语句可以有catch和finally块 就像一个普通的try语句。在try with resources语句中,任何 catch或finally块在声明的资源被释放后运行

    因此,根据文档,如果在尝试关闭资源时发生异常,并且我真诚地尝试对这条不幸的消息做出某种反应,如下所示:

    try (OutputStream os = new SampleStream(true)) {
      os.write(0); // both this and closing can throw IOWriteException 
    } 
    catch (IOWriteException e) {
        //do something wise;
    }
    

    在关闭出现问题时,catch块将永远等待关闭。

    我知道,事实并非如此,而且可以捕获关闭时的try with resources异常。但是,应该重新制定上述规则。怎么用?

    1 回复  |  直到 6 年前
        1
  •  2
  •   davidxxx    6 年前

    我知道,那真的不是这样的,试着用资源例外 在关闭时可以捕获。

    是的,也是在初始化资源时。

    我认为 the extended try-with-resources part of the JLS 可能有助于重新解释这个相当尴尬的解释。
    而关于 finally 声明。

    我们可以说:

    A catch try with resources语句中的语句允许捕获在该语句的任何部分抛出的兼容异常,即 1) 在资源初始化期间,2)在任何资源的资源关闭期间,或3)在try with resources主体中执行的by语句
    关于 最后 声明, (或试图成为)。

    参考文献:

    try with resources语句至少包含一个 条款和/或a 最后 子句称为扩展的try with resources语句。

    扩展try with resources语句的含义:

    try ResourceSpecification
        Block
    Catchesopt
    Finallyopt
    

    语句(§14.20.3.1)嵌套在 try-catch try-finally try-catch-finally 声明:

    try {
        try ResourceSpecification
            Block
    }
    Catchesopt
    Finallyopt
    

    翻译的效果是 ResourceSpecification try 声明。这允许 扩展条款 请尝试使用resources语句捕获由于 自动初始化或关闭任何资源。

    关闭)到 执行块,与 合同目的 最后 关键字。