第9章 Java异常处理

40 篇文章 0 订阅
40 篇文章 0 订阅

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

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

3. finally

  1. 有些语句,不管是否发生了异常,都必须要执行,那么就可以把这样的语句放到finally语句块中。
  2. 通常在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("程序继续...");

    }

}

9.3.2 显式声明抛出异常(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异常的要求

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

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

正确的示例代码:

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{}

}

 

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值