我正在学习在线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(使用前将#替换为@)