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("程序继续..."); } } |