我对使用try / catch / finally子句有疑问,让我解释一下: 我知道在声明中声明异常规范的每个方法都必须用try块包围(在调用方法中),然后是一个可以捕获该异常的catch块(除非我没有声明调用方法抛出一个例外)。如果调用方法在try-catch之后有其他语句,那么无论发生什么(抛出或不抛出异常)都会执行这些语句。如果我有以下代码:
public class ExceptionCall {
Throwing t = new Throwing();
public void methodTry(){
while(true){
try {
if (t.flag++==0)
t.throwing();
System.out.println("no exception");
}
catch (MyException e) {
e.printStackTrace(System.err);
System.out.println("working on it!");
}
finally{
System.out.println("finally clause");
}
System.out.println("out");
if (t.flag==2)
break;
}
}
}
这里Throwing
有一个名为(guess what :))throw()的方法,它被声明为抛出一个MyException exception
,并且有一个名为flag的公共字段,其中包含一个初始化为0的int,以提供一个条件检查。
因此,无论try块中发生什么,都会执行几次保护区域外的代码。
所以我的问题是,最后一块是什么?我的意思是,我知道当调用方法从try或catch块返回时它会派上用场(在这种情况下我可以在catch中有一个break语句并且finally会被执行),但在这种情况下,这是什么差Δφ
答案 0 :(得分:5)
当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。
请参阅:https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
答案 1 :(得分:3)
最后块用于处理那些需要您在语句末尾执行某些操作的资源,无论代码中发生什么。
例如:读者或流是在使用后必须关闭的资源,但在使用期间可能会发生异常,因此关闭它们的地方???
这里finally
子句变得非常方便:
FileReader reader;
try {
reader = new FileReader("someNonExistingFile");
} catch (FileNotFoundException e) {
// handle FileNotFoundException
e.printMessage();
} finally {
// reader MUST BE CLOSED ALWAYS, so FINALLY, CLOSE IT
reader.close();
}
在此示例中,您需要始终关闭阅读器(如果文件存在且文件不存在),那么您使用{{而不是关闭它两次(在try
和catch
中) 1}}。
最后here的更多信息和示例。另请检查try with resources(Java 7 +)。