class Demo {
public static void main(String args[]) {
System.out.println("Start main");
try {
//exceptional code
int x=43/0;
} catch(ArithmeticException e) {
e.printStackTrace();
} finally {
System.out.println("final code");
}
System.out.println("End main");
}
}
我使用上面的代码来理解finally
块的机制。在这种情况下,我观察到的是,即使没有该catch块,finally块也会执行并显示发生的异常。但我观察到的差异是,当不使用catch块时,不会打印“End main”。我想知道finally块执行的原因,即使未使用catch子句处理异常。我想知道finally块的基本功能是什么。
答案 0 :(得分:5)
最后,无论是否存在异常,都使用块来运行代码。最后总是执行相关的try块。
通常最终用于关闭try块中打开的资源。最后这样做的原因是,无论是否有例外,我们都应该关闭这个例子。但是在Java 7中,如果您对AutoCloseable资源使用try with resource,那么您真的不需要为此烦恼。
在你的代码中,最终的相关性除了学习最终如何工作之外什么都没有。
了解有关finally的更多信息:http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
和来自同一链接的说明:
重要:finally块是防止资源的关键工具 泄漏。关闭文件或以其他方式恢复资源时,请放置 finally块中的代码,以确保始终使用资源 回收
如果您使用的是Java SE 7或更高版本,请考虑使用 在这些情况下自动尝试使用资源语句 不再需要时释放系统资源。
答案 1 :(得分:1)
无论try
或catch
块发生什么,finally
原因都会确保*将会执行。
* finally
阻止只有当您在Thread
/ try
区块中运行时中断或终止当前catch
时才会执行。
这是一个更具体的docs。
答案 2 :(得分:0)
当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。
因此,如果您必须保证正在执行的操作(例如somePrintWriter.close()
,但希望在此之前仍然处理任何异常,则finally块将执行它。
答案 3 :(得分:0)
在Java中使用try-catch-finally块 - 或者try-with-resources块来实现与C ++中的对象终结器类似的功能。
虽然它们用于异常处理,但finally
语句块最重要的功能可能是关闭或释放在try
中执行代码期间打开或创建的资源。块。
请注意,对象终结器在Java中存在(在时尚之后),但它们几乎不应该用于最终化对象......很奇怪,是吗?