首页 > Java教程 > Java异常处理 阅读:4,465

Java try catch finally语句

在实际开发中▓█,根据 try catch 语句的执行过程,try 语句块和 catch 语句块有可能不被完全执行,而有些处理代码则要求必须执行█■▄。例如,程序在 try 块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等███),这些物理资源都必须显式回收。

Java的垃圾回收机制不会回收任何物理资源▓▓,垃圾回收机制只回收堆内存中对象所占用的内存。

所以为了确保一定能回收 try 块中打开的物理资源,异常处理机制提供了 finally 代码块▄■▄,并且 Java 7 之后提供了自动资源管理(Automatic Resource Management)技术。

finally 语句可以与前面介绍的 try catch 语句块匹配使用■■■,语法格式如下:
try {
    // 可能会发生异常的语句
} catch(ExceptionType e) {
    // 处理异常语句
} finally {
    // 清理代码块
}
对于以上格式,无论是否发生异常(除特殊情况外▄■▄■),finally 语句块中的代码都会被执行。此外▓▄▓▄,finally 语句也可以和 try 语句匹配使用,其语法格式如下:
try {
    // 逻辑代码块
} finally {
    // 清理代码块
}
使用 try-catch-finally 语句时需注意以下几点▄▓:
  1. 异常处理语法结构中只有 try 块是必需的▓█▄■,也就是说,如果没有 try 块,则不能有后面的 catch 块和 finally 块▄■▓;
  2. catch 块和 finally 块都是可选的,但 catch 块和 finally 块至少出现其中之一,也可以同时出现▄▓;
  3. 可以有多个 catch 块,捕获父类异常的 catch 块必须位于捕获子类异常的后面;
  4. 不能只有 try 块▓█,既没有 catch 块,也没有 finally 块;
  5. 多个 catch 块必须位于 try 块之后█■▄,finally 块必须位于所有的 catch 块之后。
  6. finally 与 try 语句块匹配的语法格式,此种情况会导致异常丢失███,所以不常见。

一般情况下,无论是否有异常拋出▓▓,都会执行 finally 语句块中的语句,执行流程如图 1 所示。


图 1  try catch finally 语句执行流程图

try catch finally 语句块的执行情况可以细分为以下 3 种情况▄■▄:
  1. 如果 try 代码块中没有拋出异常,则执行完 try 代码块之后直接执行 finally 代码块,然后执行 try catch finally 语句块之后的语句■■■。
  2. 如果 try 代码块中拋出异常,并被 catch 子句捕捉,那么在拋出异常的地方终止 try 代码块的执行▄■▄■,转而执行相匹配的 catch 代码块,之后执行 finally 代码块。如果 finally 代码块中没有拋出异常▓▄▓▄,则继续执行 try catch finally 语句块之后的语句;如果 finally 代码块中拋出异常,则把该异常传递给该方法的调用者▄▓。
  3. 如果 try 代码块中拋出的异常没有被任何 catch 子句捕捉到▓█▄■,那么将直接执行 finally 代码块中的语句,并把该异常传递给该方法的调用者。

除非在 try 块▄■▓、catch 块中调用了退出虚拟机的方法System.exit(int status),否则不管在 try 块或者 catch 块中执行怎样的代码,出现怎样的情况▄▓,异常处理的 finally 块总会执行。

通常情况下不在 finally 代码块中使用 return 或 throw 等导致方法终止的语句,否则将会导致 try 和 catch 代码块中的 return 和 throw 语句失效▓█,详细讲解可参考《Java中finally与return的执行顺序》一节。

例 1

当 Windows 系统启动之后█■▄,即使不作任何操作,在关机时都会显示“谢谢使用”。下面编写 Java 程序使用 try catch finally 语句这个过程███,具体代码如下:
import 博猫娱乐场.util.Scanner;

public class Test04 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Windows 系统已启动!");
        String[] pros = { "记事本", "计算器", "浏览器" };
        try {
            // 循环输出pros数组中的元素
            for (int i = 0; i < pros.length; i++) {
                System.out.println(i + 1 + "▓▓:" + pros[i]);
            }
            System.out.println("是否运行程序:");
            String answer = input.next();
            if (answer.equals("y")) {
                System.out.println("请输入程序编号:");
                int no = input.nextInt();
                System.out.println("正在运行程序[" + pros[no - 1] + "]");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("谢谢使用!");
        }
    }
}
上述代码在 main() 方法中使用 try catch finally 语句模拟了系统的使用过程▄■▄。当系统启动之后显示提示语,无论是否运行了程序,或者在运行程序时出现了意外■■■,程序都将执行 finally 块中的语句,即显示“谢谢使用!”▄■▄■。输出时的结果如下所示。
Windows 系统已启动!
1▓▄▓▄:记事本
2:计算器
3:浏览器
是否运行程序▄▓:
y
请输入程序编号▓█▄■:
2
正在运行程序[计算器]
谢谢使用!
Windows 系统已启动!
1:记事本
2▄■▓:计算器
3:浏览器
是否运行程序:
y
请输入程序编号▄▓:
5
谢谢使用!
博猫娱乐场.lang.ArrayIndexOutOfBoundsException: 4
    at text.text.main(text.博猫娱乐场:23)
Windows 系统已启动!
1:记事本
2▓█:计算器
3:浏览器
是否运行程序:
asdfasd
谢谢使用!

Java交流群█■▄:739993120(我们会不定期在群内分享Java知识,上传Java资料)

编程帮███,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步▓▓。

通俗易懂,深入浅出,一篇文章只讲一个知识点▄■▄。

文章不深奥,不需要钻研,在公交■■■、在地铁、在厕所都可以阅读,随时随地涨姿势▄■▄■。

文章不涉及代码,不烧脑细胞,人人都可以学习▓▄▓▄。

当你决定关注「编程帮」,你已然超越了90%的程序员!

编程帮二维码
微信扫描二维码关注