09.Java–try…catch和finally
当程序发生异常时,会立即终止,无法继续向下执行。为了保证程序能够有效的执行,Java中提供了一种对异常进行处理的方式一异 常捕获。异常捕获通常使用try…catch语句,其具体语法格式如下:
try{
//可能发生的异常的语句
}catch(Exception e){
//对捕获的异常进行相应处理
}
上述代码中,try{}代码块中包含的是可能发生异常的语句,catch(){}代码块中编写针对捕获的异常进行处理的代码。当try{}代码块中的程序发生了异常,系统会将这个异常的信息封装成一个异常对象,并将这个对象传递给catch(){}代码块。catch(){}代码块需要一个参数指明它所能够接收的异常类型,这个参数的类型必须是Exception类或其子类。
示例
public class Example29 {
// 下面的方法实现了两个整数相除
public static int divide(int x, int y) {
try {
int result = x / y;
return result;
} catch (Exception e) {
System.out.println("捕获的异常信息为:" + e.getMessage());
}
return -1;// 定义当程序发生异常直接返回-1
}
public static void main(String[] args) {
int result = divide(4, 0);// 调用divide()方法
if (result == -1) {// 对调用方法返回结果发生判断
System.out.println("程序发生异常");
} else {
System.out.println(result);
}
}
}
结果
在定义的整数除法运算方法divide()中对可能发生异常的代码用try…catch语句进行了捕获处理。在try{}代码块中发生被0除异常,程序会转而执行catch(){}中的代码,通过调用Exception对象的getMessage()方法,即可返回异常信息“/ by zero"。catch(){}代码块对异常处理完毕后,程序仍会向下执行,而不会因为异常而终止运行。需要注意的是,在try{ }代码块中,发生异常语句后面的代码是不会被执行的,如例中第6行代码的return语句就没有执行。
在程序中,有时候会希望有些语句无论程序是否发生异常都要执行,这时就可以在try-catch语句后,加一个finally{}代码块。接下来对例29进行修改,演示finally{}代码块的用法,如例30所示。
public class Example30 {
// 下面的方法实现了两个整数相除
public static int divide(int x, int y) {
try {
int result = x / y;
return result;
} catch (Exception e) {
System.out.println("捕获的异常信息为:" + e.getMessage());
} finally {
System.out.println("执行finally代码块,无论程序是否异常,都会执行");
}
return -1;// 定义当程序发生异常直接返回-1
}
public static void main(String[] args) {
int result = divide(4, 0);// 调用divide()方法
if (result == -1) {// 对调用方法返回结果发生判断
System.out.println("程序发生异常");
} else {
System.out.println(result);
}
}
}
结果
例30中,divide()方法中增加了一个finally{}代码块,用于处理无论程序是否发生异常都要执行的语句,该代码块并不受return语句和程序异常的影响。正是由于这种特殊性,在程序设计时,经常会在try-catch后使用finally{}代码块来完成必须做的事情,例如释放系统资源、关闭线程池等。需要注意的是,finally中的代码在-种情况下是不会执行的,那就是在try-catch中执行System.exit(0)语句。System.exit(0)表示退出当前的Java虛拟机,Java虚拟机停止了,任何代码都不能再执行了。