JavaSE进阶

9.3 异常处理机制

9.3.1 捕获异常(try...catch...finally)

可使用try…catch…finally语句捕获异常,避免程序不正常终止

语法:

try {

……

} [catch (<异常类型>  <异常引用变量>) {

……

} ]*  

[finally {

……

}]

说明:

(1)*可使用多个catch子句捕获多个异常,[]表示可选。

(2)可以有如下组合形式:try...catch,try...finally,try...catch...finally。

1. try

try块中是可能发生异常的代码。其中某句代码发生异常,就会跳过try块中该句后面的代码,该句代码处会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理。

注意:

一个try必须带一个catch块或finally块或两者都有,即try块不能单独存在。

当异常处理的代码执行结束以后,是不会回到try语句块去执行尚未执行的代码的。只会执行try...catch...finally后面的代码。

2. catch

  • 每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。
  • catch块如果多个,异常对象将从上到下依次匹配类型,一旦某个catch的异常类型匹配成功,其他的catch将不再执行,即一个异常只能进入一个catch块。
  • catch可以有多个,但是多个catch中的异常类型如果是“互斥关系(没有继承关系)”,顺序随意;如果是“包含关系(继承关系)”,必须小上大下/子上父下。

3. finally

  • 有些语句,不管是否发生了异常,都必须要执行,那么就可以把这样的语句放到finally语句块中。
  • 通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。

4. 运行示意图

try...catch...finally的运行示意图,如图10-9

图10- 9 try...catch...finally运行示意图

5. 示例

(1)示例1

package com.atguigu.exception;

public class TestException {

public static void main(String[] args) {

try {

int a = Integer.parseInt(args[0]);

int b = Integer.parseInt(args[1]);

System.out.println(a + "/" + b + "=" + a/b);

} catch (NumberFormatException e) {

e.printStackTrace();

} catch (ArrayIndexOutOfBoundsException e) {

e.printStackTrace();

} catch (ArithmeticException e) {

e.printStackTrace();

}

System.out.println("程序继续...");

}

}

(2)示例2

package com.atguigu.exception;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

public class TestFileReader {

public static void main(String[] args) {

FileReader fr = null;

try {

fr = new FileReader("d:/a.txt");

char c = (char) fr.read();

System.out.println(c);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

//IOException不能放前面,因为FileNotFoundException 是子类

e.printStackTrace();

} finally{

              //可以嵌套

try {

if(fr!=null){//需要判断非空

fr.close();

}

} catch (IOException e) {

e.printStackTrace();

}

        }

        System.out.println("程序继续...");

}

}