finally
块跟随 try
块或 catch
块。无论是否发生异常,finally
块中的代码总是会被执行。
使用 finally
块允许你在受保护的代码中无论发生什么情况都会执行任何清理类型的语句。
finally
块的语法
finally
块出现在 catch
块的末尾,并具有以下语法:
try {
} catch (ExceptionType1 e1) {
} catch (ExceptionType2 e2) {
} catch (ExceptionType3 e3) {
} finally {
}
使用 finally
块时需要注意的事项
-
-
不强制要求在有
try/catch
块时必须有 finally
子句。
-
try
块不能没有 catch
子句或 finally
子句。
-
在
try
、catch
、finally
块之间不能有任何其他代码。
-
如果在
finally
块之前调用了 exit()
方法或者程序执行过程中发生致命错误,finally
块将不会被执行。
-
即使方法在
finally
块之前返回了一个值,finally
块也会被执行。
为什么使用 Java finally
块?
Java finally
块可用于清理(关闭)连接、打开的文件、流等,这些都必须在退出程序之前关闭。 它还可以用来打印一些最终信息。
Java finally
块示例
以下是一个代码段,展示了如何在处理完异常后的 try/catch
语句后使用 finally
。在此示例中,我们通过使用无效索引来访问数组元素来制造一个错误。catch
块处理异常并打印相同的异常。现在在 finally
块中,我们打印一条语句,表明 finally
块正在被执行。
package com.tutorialspoint;
public class ExcepTest {
public static void main(String args[]) {
int a[] = new int[2];
try {
System.out.println("访问第三个元素:" + a[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("异常抛出:" + e);
} finally {
a[0] = 6;
System.out.println("第一个元素值:" + a[0]);
System.out.println("finally 语句被执行");
}
}
}
输出:
异常抛出:java.lang.ArrayIndexOutOfBoundsException: 3
第一个元素值:6
finally 语句被执行
更多示例
示例 1
以下是一个代码段,展示了即使异常未被处理,如何在 try/catch
语句后使用 finally
。在此示例中,我们通过使用无效索引来访问数组元素来制造一个错误。由于 catch
块未处理异常,我们可以从输出中检查 finally
块打印了一条语句,表明 finally
块正在被执行。
package com.tutorialspoint;
public class ExcepTest {
public static void main(String args[]) {
int a[] = new int[2];
try {
System.out.println("访问第三个元素:" + a[3]);
} catch (ArithmeticException e) {
System.out.println("异常抛出:" + e);
} finally {
a[0] = 6;
System.out.println("第一个元素值:" + a[0]);
System.out.println("finally 语句被执行");
}
}
}
输出:
第一个元素值:6
finally 语句被执行
主线程异常:java.lang.ArrayIndexOutOfBoundsException: 3
at com.tutorialspoint.ExcepTest.main(ExcepTest.java:8)
示例 2
以下是一个代码段,展示了当一个方法可以在 try
块内返回一个值时如何使用 finally
块。在此示例中,我们在 try
块内返回一个值。我们可以从输出中检查 finally
块打印了一条语句,表明即使方法向调用函数返回了一个值,finally
块仍然被执行。
package com.tutorialspoint;
public class ExcepTest {
public static void main(String args[]) {
System.out.println(testFinallyBlock());
}
private static int testFinallyBlock() {
int a[] = new int[2];
try {
return 1;
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("异常抛出:" + e);
} finally {
a[0] = 6;
System.out.println("第一个元素值:" + a[0]);
System.out.println("finally 语句被执行");
}
return 0;
}
}
输出:
第一个元素值:6
finally 语句被执行
1