编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

try…catch和finally

上面的例子中,由于发生了异常,程序立即终止,无法继续向下执行。为了解决这样的问题,Java中提供了一种对异常进行处理的方式———异常捕获。异常捕获通常使用try…catch语句,具体语法格式如下:

try{
//程序代码块
}catch(ExceptionType(Exception 类及其子类) e){
//对ExceptionType 的处理
}

其中在try代码块中编写可能发生异常的Java语句,catch代码块中编写针对异常进行处理的代码。当try代码块中的程序发生了异常,系统会将这个异常的信息封装成一个异常对象,并将这个对象传递给catch代码块。catch代码块需要一个参数指明它所能够接收的异常类型,这个参数的类型必须是Exception类或其子类。

接下来使用try…catch语句对上面例中出现的异常进行捕获。

public class Example {
    public static void main(String[] args) {
        // 下面的代码定义了一个try…catch 语句用于捕获异常
        try {
            int result = divide(4, 0); // 调用divide()方法
            System.out.println(result);
        } catch (Exception e) { // 对异常进行处理
            System.out.println("捕获的异常信息为: " + e.getMessage());
        }
        System.out.println("程序继续向下执行……");
    }
    // 下面的方法实现了两个整数相除
    public static int divide(int x, int y) {
        int result = x / y; // 定义一个变量result 记录两个数相除的结果
        return result; // 将结果返回
    }
}

运行结果:

捕获的异常信息为: / by zero
程序继续向下执行……

例中,对可能发生异常的代码用try…catch语句进行了处理。在try代码块中发生被0 除异常,程序会转而执行catch 中的代码,通过调用Exception 对象的getMessage()方法,返回异常信息“/byzero”。catch代码块对异常处理完毕后,程序仍会向下执行,而不会异常终止。

在程序中,有时候我们希望有些语句无论程序是否发生异常都要执行,这时就可以在try…catch 语句后,加一个finally代码块。接下来对例4-22 进行修改,演示一下finally代码块的用法,如例所示。

public class Example {
    public static void main(String[] args) {
        // 下面的代码定义了一个try…catch 语句用于捕获异常
        try {
            int result = divide(4, 0); // 调用divide()方法
            System.out.println(result);
        } catch (Exception e) { // 对异常进行处理
            System.out.println("捕获的异常信息为: " + e.getMessage());
        } finally {
            System.out.println("进入finally 代码块");
        }
        System.out.println("程序继续向下执行……");
    }
    // 下面的方法实现了两个整数相除
    public static int divide(int x, int y) {
        int result = x / y; // 定义一个变量result 记录两个数相除的结果
        return result; // 将结果返回
    }
}

运行结果:

捕获的异常信息为: / by zero
进入finally 代码块
程序继续向下执行……

在catch代码块中增加了一个return语句,用于结束当前方法,此时程序第12行代码就不会执行了,而finally中的代码仍会执行,并不会被return语句所影响,也就是说不论程序是发生异常还是使用return语句结束,finally中的语句都会执行,正是由于这种特殊性,在程序设计时,经常会在try…catch后使用finally代码块来完成必须做的事情,例如释放系统资源。

需要注意的是,finally中的代码块有一种情况下是不会执行的,那就是在try…catch中执行了System.exit(0)语句。System.exit(0)表示退出当前的Java虚拟机,Java虚拟机停止了,任何代码都不能再执行了。


未经允许不得转载: 技术文章 » Java编程 » try…catch和finally