[英]What is the functionality of a “finally” block?
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”。 我想知道即使未使用catch子句处理异常,finally块仍执行的原因。 我想知道finally块的基本功能是什么。
最后,无论是否存在异常,都使用块来运行代码。 最后,总是为相关的try块执行。
通常,finally通常用于关闭在try块中打开的资源。 最后这样做的原因是,无论是否有异常,我们都应该关闭资源。 但是在Java 7中,如果您对自动关闭的资源使用try资源,那么您实际上不需要理会。
在您的代码中,finally的相关性仅在于了解finally的工作原理。
了解有关final的更多信息: http : //docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
和来自同一链接的注释:
重要提示 :finally块是防止资源泄漏的关键工具。 当关闭文件或以其他方式恢复资源时,请将代码放在finally块中以确保始终恢复资源。
如果使用Java SE 7或更高版本,请考虑在这些情况下使用try-with-resources语句,该语句在不再需要时会自动释放系统资源。
无论try
或catch
块发生什么, finally
原因都会为您确保*将被执行。
*仅当您在try
/ catch
块中运行当前Thread
时中断或杀死该Thread
时, finally
块才会执行。
这是更具体的文档 。
从Java教程 :
try块退出时,finally块始终执行。 这样可以确保即使发生意外异常,也可以执行finally块。 但是,最后,它不仅对异常处理有用,它还使程序员避免因返回,继续或中断而意外地跳过清理代码。 即使在没有例外的情况下,将清除代码放在finally块中始终是一个好习惯。
因此,如果您必须保证正在执行某项操作,例如somePrintWriter.close()
,但仍要在此之前处理任何异常,则finally块将执行该操作。
在Java中使用try-catch-finally块或try-with-resources块来实现与C ++中的对象终结器类似的功能。
当它们用于异常处理时, finally
语句块最重要的功能可能是关闭或释放在try
块中执行代码期间已打开或创建的资源。
请注意,对象终结器在Java中存在(某种形式),但几乎不应使用它们来终结对象……很奇怪,是吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.