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

从try块和try with资源语句引发的异常

吴俊晤
2023-03-14

考虑来自Java文档的以下代码。

static String readFirstLineFromFile(String path) throws IOException {
    try (**BufferedReader br = new BufferedReader(new FileReader(path))**) {
        **return br.readLine();**
    }
}

根据Java文档,

在示例readFirstLineFromFile中,如果从try块和try with resources语句抛出异常,则方法readFirstLineFromFile抛出从try块抛出的异常;禁止从try with resources块引发的异常。

另一方面,也提到了

由于BufferedReader实例是在try with resource语句中声明的,因此无论try语句是正常完成还是突然完成(由于方法BufferedReader.readLine引发IOException)。

(这意味着只有在执行try块后才调用close方法……据我所知)

因此,假设try with resources语句和try block抛出异常,并考虑抛出异常的顺序

1)异常首先从tryblock返回br.readLine();

2)然后一旦try块完成(无论是否从try块抛出异常),就会调用缓冲阅读器的关闭方法,然后它也抛出异常

因此,理想情况下,从方法readFirstLineFromFile抛出的异常应该是来自BufferedReader的close方法的异常(因为它是最后执行的),而不是来自返回br的异常。readLine() 内部try块(与Javadocs中提到的内容相比)

有人能澄清我的疑问吗。

共有1个答案

归俊
2023-03-14

你会假设try(

因此,无论成功与否,它都会关闭可关闭项(如果适用)

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

  • 我正在尝试获得PSQLException异常,但是它告诉我这个块无法到达,有人知道为什么吗?我的意思是,我不能运行或任何东西,Eclipse标记为一个错误。但是,例如,如果我放置异常e,而不是PSQLException e,它不会给出错误。

  • **程序需要做的事情:** 当它运行时接受两个命令行参数,否则抛出一个错误。该规则包含以下要求:“如果没有命令参数,则执行I/O错误处理。” 问题是,每次尝试使用I/O异常捕获时,都会收到以下错误: 无法访问IOException得catch块.此异常从不从try语句正文引发 我从Eclipse获得的快速修复建议: 1。删除Catch条款2。用close替换Catch子句 下面是我的代码: nul

  • 我写了一段代码,每当我用特定的图像名称点击url时返回图像,如果找不到图像,就返回错误图像。 但我还是会遇到这个错误,当我试图击中错误的图像 代码出了什么问题?

  • 本文向大家介绍浅谈java7增强的try语句关闭资源,包括了浅谈java7增强的try语句关闭资源的使用技巧和注意事项,需要的朋友参考一下 java7增强的try语句关闭资源 传统的关闭资源方式 使用finally块来关闭物理资源,保证关闭操作总是会被执行。 关闭每个资源之前首先保证引用该资源的引用变量不为null。 为每一个物理资源使用单独的try...catch块来关闭资源,保证关闭资源时引发

  • 问题内容: 我在Java中进行异常处理时遇到问题,这是我的代码。尝试运行以下行时出现编译器错误:。错误是: 永远不会在相应的try语句的主体中引发MojException异常 这是代码: 这是MojException的代码: 谁能帮我这个? 问题答案: try语句中的catch块需要 精确 捕获-block 内的代码 可能 抛出的异常(或该异常的超类)。 您想做的是这样的: 这将导致编译器错误,因