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

如果从语句抛出异常(初始化问题),try with resource语句中的单个资源是否不会关闭

龚志
2023-03-14

示例代码:

    class TestCharStream {
        public static void main(String[] args){
// Assume specified file is not available in the location
            try (Reader reader = new FileReader("C:\\TestData\\test123.txt")) {
                System.out.println("Entered Try block");
                int content;
                while ((content = reader.read()) != -1) {
                    System.out.print((char) content);
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

由于该文件不可用,将引发“FileNotFoundException”,并且无法初始化资源。

从Java SE7规范中,我理解了以下与“try with resources”语句相关的要点

  • 如果资源初始化失败(即,其初始值设定项表达式引发异常),那么到目前为止由try-with-resources语句初始化的所有资源都将关闭。
  • 仅当资源初始化为非空值时才关闭。
  • 如果从try块和try-with-resources语句都抛出异常,则方法抛出从try块抛出的异常;从try-with-resources语句引发的异常将被禁止。

我有关于关闭资源、抑制与上面指定的点相关的异常的问题

共有1个答案

公良弘毅
2023-03-14

1)上面的示例代码是否适用(即。资源初始化失败)不属于此方案。无论try语句是正常完成还是突然完成,资源都将关闭。这是否仅适用于在try with resources语句中成功初始化且try块中有错误的资源?

不清楚您用“resource will be close informer of the try语句complete normal or surruptly”指的是什么。然而,如果在资源规范中尝试初始化一个资源引发了异常,则为“否”,则该资源没有被关闭,因为它没有被初始化为非空值(您的第二个要点,是JLS文本的节选)。

如果资源规范中有多个资源,那么有可能在初始化其中一个资源之前对其中一些资源进行初始化;在这种情况下,成功初始化为非空值的那些将被关闭。

2)如果在初始化资源时抛出异常(如本例),这将属于未成功初始化的场景。在这种情况下,我们如何遇到在try-with-resources语句中抛出异常的场景(基本上只能在初始化时发生)?是关闭资源时抛出的异常吗?

try-with-resources语句是一个复合语句,包含了从初始try关键字到关联块的所有内容,还包括任何catchfinally子句。主要重点是在try块内部抛出异常时正确地进行清理。规范中关于资源初始化期间发生异常的情况的部分可以通过N个资源try-with-resources语句和N个嵌套的单资源try-with-resources语句之间的等价性来理解。

还要注意,JLS使用传统的try/catch/finally和显式的资源闭包将try-with-resources语句转换为等效代码。如果您正在纠结于try-with-resources的语义,那么这将是一个很好的资源。

 类似资料:
  • 我已经看到过一个类似的问题,但是我还没有找到一个解决方案,因为在我的例子中,放入try子句的函数实际上会引发一个异常。 在my try块中,psv main调用方法,该方法打印2并引发名为myexc3的异常。然后,这个异常应该由处理,它应该打印3等等。但代码实际上并不编译: 异常MyExc3从不在相应try语句的正文中抛出 这是为什么?

  • 我不是太笨,不会意识到“try catch”中的代码不能抛出异常。但是我被困在这里,因为我完全从书中复制了代码,所以它在出版时肯定是正确的。这让我想知道代码是否不能再编译了,因为它已经过时了?我意识到这个问题的性质可能会冒犯在座的一些人。如果是的话,请不要在严厉的斥责中过于严厉。 我得到了一个错误: ./streamcopier.java:13:错误:异常IOException从不在相应try语句

  • 我正在尝试使用ORDER BY查找在Hive中我的表中创建条目的最早时间。声明看起来像这样 这给我一个错误消息,如下所示: https://i.imgur.com/cgIiSKh.png 只是向您展示SELECT语句在没有ORDER BY的情况下是如何工作的: https://i.imgur.com/k6RwAd4.png 我在尝试时也犯了同样的错误 顺便说一句,timeiss是一个字符串。 以下

  • 我是一名It专业的一年级学生。我们的任务是为最终项目的支付系统创建一个概念方案。我们决定做一个工资项目。下面是我使用JOptionFrame和JOptionPane的代码片段 由于分配给工资变量的数字取决于工作职位,为了计算准确,我必须从if语句中调用它。有人有解决方案吗?

  • 考虑来自Java文档的以下代码。 根据Java文档, 在示例readFirstLineFromFile中,如果从try块和try with resources语句抛出异常,则方法readFirstLineFromFile抛出从try块抛出的异常;禁止从try with resources块引发的异常。 另一方面,也提到了 由于BufferedReader实例是在try with resource语

  • 问题内容: 我知道Java中的安全模式是在finally块中依次关闭ResultSet,Statement和Connection。 如果您关闭连接,然后尝试关闭语句(不抛出异常)。但是,如果您尝试从语句中调用任何方法,则会引发异常。 我想知道关闭连接是否会自动关闭从该连接创建的所有语句对象? 更新: 我正在使用DatabaseProductVersion:Oracle Database 11g版本