Java培训之异常处理机制

 捕获异常(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(“程序继续…”);

    }

}

 显式声明抛出异常(throws)

如果一个方法出现Checked Exception,但是并不能确定如何处理这种异常或者不立刻处理它,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。

在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。如果一个方法抛出多个受检异常,就必须在方法的签名中列出所有的异常,之间以逗号隔开。

1. 示例代码

package com.atguigu.exception;

 

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

 

public class TestFileReader2 {

    public static void main(String[] args) {

       try {

           readFile(“d:/a.txt”);

       } catch (IOException e) {

           e.printStackTrace();

       }

    }

 

    public static void readFile(String filename) throws FileNotFoundException,IOException{

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

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

       System.out.println(c);

       fr.close();

    }

}

2. 重写方法对throws异常的要求

重写方法不能抛出比被重写方法范围更大的异常类型。在多态的情况下,对重写方法的调用–异常的捕获按父类声明的异常处理。即

  • 父类被重写的方法没有声明抛出checked受检异常,那么重写的方法也不能声明抛出异常
  • 子类重写方法声明抛出的异常的类型和父类被重写的方法声明抛出异常类型一致
  • 子类重写方法声明抛出的异常的类型是父类被重写的方法声明抛出异常的子类
  • 子类重写方法可以在方法内部处理异常,而不声明抛出异常

正确的示例代码:

class A{

    public void method()throws IOException{}

}

class B extends A{

    public void method(){}

}

class C extends A{

    public void method() throws FileNotFoundException{}

}

class D extends A{

    public void method() throws IOException,FileNotFoundException{}

}

class E extends A{

    public void method() throws IOException,RuntimeException{}

}

错误的示例代码:

class A{

    public void method()throws IOException{}

}

class F extends A{

    public void method() throws Exception {}

}

class G extends A{

    public void method() throws IOException,SQLException{}

}

想要了解跟多关于Java培训课程内容欢迎关注尚硅谷Java培训培训,尚硅谷除了这些技术文章外还有免费的高质量Java培训课程视频供广大学员下载学习


上一篇:
下一篇:
关于尚硅谷
教育理念
名师团队
学员心声
资源下载
视频下载
资料下载
工具下载
加入我们
招聘岗位
岗位介绍
招贤纳师
联系我们
电话:010-56253825
邮箱:info@atguigu.com
地址:北京市昌平区宏福科技园综合楼6层(北京校区)

 深圳市宝安区西部硅谷大厦B座C区一层(深圳校区)

上海市松江区谷阳北路166号大江商厦6层(上海校区)