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