这个finally子句包含close()调用的原因是什么

2024-06-21

我正在学习在线java课程,使用 Java 编程简介 http://math.hws.edu/javanotes/index.html.

在 I/O 章节中,引入了以下代码:

顺便说一下,在本程序的末尾,您将发现我们第一个有用的 try 语句中的 finally 子句示例。当计算机执行 try 语句时,无论如何,都保证执行其 finally 子句中的命令。

该程序位于本节的末尾11.2.1 http://math.hws.edu/javanotes/c11/s2.html#IO.2.1它是一个简单的程序,只是从文件中读取一些数字并以相反的顺序写入它们。

main方法中相关代码为(data是Reader,result是Writer):

try {
    // Read numbers from the input file, adding them to the ArrayList.        
    while ( data.eof() == false ) {  // Read until end-of-file.
        double inputNumber = data.getlnDouble();
        numbers.add( inputNumber );
    }

    // Output the numbers in reverse order.        
    for (int i = numbers.size()-1; i >= 0; i--)
        result.println(numbers.get(i));

    System.out.println("Done!");        
} catch (IOException e) {
    // Some problem reading the data from the input file.
    System.out.println("Input Error: " + e.getMessage());
} finally {
    // Finish by closing the files, whatever else may have happened.
    data.close();
    result.close();
}

所以我想知道为什么在这种情况下,当 try 或 catch 子句没有其他退出点时,finally 子句很有用。 close 方法不能只在 main 主体中吗?

我想也许是因为理论上可能存在其他一些 RuntimeException 可能会导致程序崩溃,然后使 Reader 和 Writers 保持未关闭状态,但是程序崩溃的事实是否不会关闭它们呢?


您的想法是正确的:即使发生意外异常,finally 块也会关闭资源。

您也是对的,如果此类异常使整个应用程序崩溃,这是无关紧要的,但通过查看此代码,您无法确定是否是这种情况。可能有其他异常处理程序捕获该异常,因此将关闭逻辑放在 finally 块中是良好且正确的做法。

请注意,仍然可能隐藏着一个错误:如果data.close()抛出异常,result.close()永远不会被叫到。

根据您的环境,修复错误的方法有多种。

  • 在java 7 ff中你可以使用尝试资源 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

  • 如果您使用 Spring,可能有一个类似于以下的合适模板Jdbc模板 http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html

  • 如果这些都不适用,是的,你必须在finally中进行try/finally。别再丑了您绝对应该至少将其提取到评论中建议的方法中。

  • 在 java pre 8 中概念上更清晰但相当冗长的是实现贷款模式 https://stackoverflow.com/questions/20762240/loan-pattern-in-scala。如果您不碰巧与 scala/clojure/haskell 开发人员一起工作,那么可能会比其他任何事情都更令人困惑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这个finally子句包含close()调用的原因是什么 的相关文章

随机推荐

  • 如何获得没有前缀的虚拟人物?

    我想从两个不同的列中获取虚拟数据 但没有任何前缀 资料说明 X Y 123 AAA 456 BBB 123 AAA 789 CCC 预期结果 X Y 789 456 123 CCC BBB AAA 123 AAA 0 0 1 0 0 1 4
  • 如何在 sql 2005 或 2008 中使列区分大小写

    是否可以根据列更改默认排序规则 我想让 1 列区分大小写 但其他所有列都不区分大小写 ALTER TABLE ALTER COLUMN允许更改单个列的排序规则 alter table Foo alter column Bar ntext c
  • 系统地将函数应用于 haskell 记录的所有字段

    我有一条包含不同类型字段的记录 以及一个适用于所有这些类型的函数 举一个小 愚蠢 的例子 data Rec Rec flnum Float intnum Int deriving Show 比如说 我想定义一个为每个字段添加两条记录的函数
  • 当另一个线程发生事情时从主线程获取数据?

    目前我有一个线程正在运行一个侦听连接的套接字 当它收到连接时 它需要上传在主线程中收集的数据 即从主线程获取数据 但是 我传递了对象的实例 但它从未使用等待连接时收集的数据进行更新 有没有正确的方法来做到这一点 我用谷歌搜索了一下 似乎找不
  • Web SQL 数据库 + Javascript 循环

    我正在尝试解决这个问题 但我自己似乎无法解决 我正在使用 Web SQL DB 但无法让循环正常使用它 I use for var i 0 i lt numberofArticles 1 i db transaction function
  • Spring Cloud Gateway总是返回HTTP状态503,如何解决?

    我正在尝试将 Spring Cloud Gateway 与 Spring Security 结合使用 但不幸的是 看起来安全性并不重要 所有请求都经过其目的地 或者至少尝试经过 只是尝试一下 因为我每次都会收到 HTTP 状态 503 我在
  • 仅使用一个 #include 表达式一次包含多个头文件?

    是否有任何表达式可以使语法一次包含多个标头 而无需为每个新文件编写 include 表达式 例如 include
  • 在 Rails 中使用 gem 时,“无法删除 Object::ClassMethods”源于什么?

    我在安装 gems 时经常遇到这样的问题 有谁知道这源于什么 我见过几个不同的案例 但仍然不知道到底是什么原因造成的 sudo rake gems install trace in u app releases 20100213003957
  • 辅助功能标识符在 iOS 模拟器的辅助功能检查器中不可见

    我想使用辅助功能检查器来验证在模拟器 iOS 9 2 中运行的应用程序中的所有辅助功能标识符 辅助功能检查器能够返回多个辅助功能字段 但不能返回标识符 知道为什么以及如何我能看到它们吗 实际上有一种方法 克里斯 普林斯 Chris Prin
  • 如何在 Python 中从 HTML 页面中提取 URL [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须用Python 编写一个网络爬
  • 我应该使用字节还是int?

    我记得曾在某处读到 即使您只需要字节 使用 Int32 更好 就性能而言 它 据说 仅适用于您不关心存储的情况 这是有效的吗 例如 我需要一个保存一周中某一天的变量 我是吗 int dayOfWeek or byte dayOfWeek E
  • 使用 onBlur 事件上的值更新 React 输入文本字段

    我有以下输入字段 在模糊时 该函数调用服务来更新服务器的输入值 完成后 它会更新输入字段 我怎样才能让它发挥作用 我可以理解为什么它不允许我更改字段 但我能做些什么才能使其工作 我无法使用defaultValue因为我会将这些字段更改为其他
  • 如何查看每秒更新的图表中的最后 10 个数据点?

    我有这个代码 private void timer Tick object sender EventArgs e timer Stop for int i 0 i lt TOTAL SENSORS i DateTime d DateTime
  • 使用 CouchDB 提供 HTML 服务

    我正在尝试将 CouchDB 与 HTML 独立 REST 架构一起使用 也就是说 除了 CouchDB 和 ajax 风格的 javascript 调用 CouchDB 之外 没有其他应用程序服务器 看起来交叉脚本是一个问题 我之前使用过
  • 求解不等式系统时“多项式错误:仅允许使用单变量多项式”

    我想找到以下两个常数的区间cons1 and cons2我写了下面的代码 from sympy import Poly from sympy import Abs from sympy solvers inequalities import
  • 如何调用ical同步服务?

    我有一个通过日历存储框架与 iCal 同步的应用程序 我注意到我需要打开 iCal 同步服务才能启动并将应用程序添加的事件和任务传输到我的 ipad 和 iphone 所以 我的问题是 有没有办法在不打开ical的情况下启动ical同步服务
  • mountPath 在 Kubernetes 中应该是绝对的,不是吗?

    花了几个小时后 我发现 Kubernetes 中不支持相对路径作为挂载路径 我在这里找到了参考挂载路径应该是绝对的 https github com kubernetes kubernetes pull 48815 files如果是 那么为
  • .Net 支持柯里化泛型吗?

    假设我们有一个嵌套的泛型类 public class A
  • .net 的自动完成文本框,支持分隔符

    我正在开发一个应用程序 它需要一个带有多个单词的自动完成 建议 下拉 的文本框 由空格等分隔符分隔 就像 StackOverflow 中的标签文本框一样 例如 我开始输入 app 它应该显示建议列表中以以下内容开头的所有单词app 当我输入
  • 这个finally子句包含close()调用的原因是什么

    我正在学习在线java课程 使用 Java 编程简介 http math hws edu javanotes index html 在 I O 章节中 引入了以下代码 顺便说一下 在本程序的末尾 您将发现我们第一个有用的 try 语句中的