【发布时间】:2014-05-01 19:58:01
【问题描述】:
我正在学习在线 java 课程,Introduction to programming Using Java。
在 I/O 章节中,下面的代码是用以下语句介绍的:
顺便说一句,在这个程序的最后,你会发现我们第一个有用的例子,即在 try 语句中的 finally 子句。当计算机执行 try 语句时,其 finally 子句中的命令无论如何都会保证执行。
该程序位于11.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 处于未关闭状态,但是程序崩溃的事实不会关闭它们吗?
【问题讨论】:
-
理论上是可能的,但这不是“保证无论如何都会被执行”。
-
“无论如何”有点高估了;)
-
在现实生活中,程序代码往往会随着时间的推移而发展。假设您已经证明(一项也需要一些资源的任务!)此时没有可能抛出其他类型的异常,因此没有其他退出点。然而,总有一天你会改变一些东西,代码会开始表现不同。因此,添加一些结构以防止自己落入陷阱是明智的。这正是所有良好实践的意义所在。唯一的例外是,如果它是一个没有未来的一次性快速和肮脏的实用程序。
-
可能是 try 块中的异常不一定会导致它崩溃,因为异常可能已在其自己的 catch 子句中或其他地方捕获(方法调用者可能已将其包装也在尝试中)。关键是您不能依赖程序崩溃并为您清理资源。
标签: java exception-handling try-catch-finally