首页 > 编程笔记 > Java笔记 阅读:10

Java finally语句的用法(附带实例)

Java 中的 try-catch 语句后面还可以跟有一个 finally 代码块,无论 try 代码块正常结束还是 catch 代码块异常结束都会执行 finally 代码块,如下图所示。


图 1 finally代码块

使用 finally 代码块的示例代码如下:
import java.util.Scanner;

public class ExceptionExample {
    public static void main(String[] args) {
        Scanner scanner = null;
        try {
            scanner = new Scanner(System.in);
            System.out.print("请输入一个整数:");
            String input = scanner.nextLine();
            int number = Integer.parseInt(input);
            System.out.println("输入的整数是:" + number);

            int dividend = 100;
            int result = dividend / number; // 尝试除以零的算术运算,引发 ArithmeticException 异常
            System.out.println("结果:" + result);
        } catch (NumberFormatException e) {
            System.out.println("输入的不是有效的整数。");
        } catch (ArithmeticException e) {
            System.out.println("发生了算术异常:" + e.getMessage());
        } catch (Exception e) {
            System.out.println("发生了其他异常。");
        } finally {
            if (scanner != null) {
                // 确保无论发生什么情况,都关闭 Scanner 资源
                scanner.close();
                System.out.printf("资源已释放。");
            }
        }
    }
}
程序运行过程如下图所示,无论是否发生了异常,都保证执行了 finally 代码块:


图 2 执行finally代码块

Java自动资源管理

使用 finally 代码块释放资源会导致程序代码大量增加,一个 finally 代码块往往比正常执行的程序还要多。在 Java 7 之后提供的自动资源管理技术可以替代 finally 代码块,优化代码结构,提高程序可读性。

自动资源管理是在 try 语句上的扩展,语法如下:
try {
    // 声明或初始化资源语句
    // 可能会生成异常语句
} catch (Throwable e1) {
    // 处理异常 e1
} catch (Throwable e2) {
    // 处理异常 e2
    ...
} catch (Throwable eN) {
    // 处理异常 eN
}
在 try 语句后面添加一对小括号“()”,其中是声明或初始化资源语句,可以有多条语句,语句之间用分号“;”分隔。

示例代码如下:
import java.util.Scanner;

public class ExceptionExample {
    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {
            System.out.print("请输入一个整数:");
            String input = scanner.nextLine();
            int number = Integer.parseInt(input);
            System.out.println("输入的整数是:" + number);

            int dividend = 100;
            int result = dividend / number; // 尝试除以零的算术运算,引发 ArithmeticException 异常
            System.out.println("结果:" + result);
        } catch (NumberFormatException e) {
            System.out.println("输入的不是有效的整数。");
        } catch (ArithmeticException e) {
            System.out.println("发生了算术异常:" + e.getMessage());
        } catch (Exception e) {
            System.out.println("发生了其他异常。");
        }
    }
}
在这个改进后的代码中,我们使用了自动资源管理 Scanner 对象。Scanner 类实现了 AutoCloseable 接口,因此在 try 代码块运行结束时会自动调用 scanner.close() 方法来关闭资源。无论代码是否发生异常,Scanner 对象都会被正确释放。这样的写法使代码更简洁,同时确保了资源的可靠释放。

相关文章