异常的基本概念

目录

一 、异常的基本概念

二 、为什么需要异常处理

三 、在程序中进行异常处理

 四 、异常类的继承结构

 五 、Java的异常处理机制

 六 、使用 Exception 进行异常处理

 

一 、异常的基本概念

异常是导致程序中断运行的一种指令流

 

二 、为什么需要异常处理

之所以需要异常处理呢,是因为如果不对异常进行正确地处理,则可能导致程序的中断运行,带来一些不必要的麻烦。所以在程序的设计中必须考虑各种异常的发生,并正确地做好相应的处理,这样才能保证程序正常地执行

 现有以下代码,被除数为0,程序运行中断,出现算数异常

public class ExceptionDemo01{
    public static void main(String args[]){
        System.out.println("********** 计算开始 ***********") ;
        int i = 10 ;		// 定义整型变量
        int j = 0 ;			// 定义整型变量
        int temp = i / j ;	// 此处产生了异常,程序中断,不再运行以下语句
        System.out.println("两个数字相除的结果:" + temp) ;
        System.out.println("********** 计算结束 ***********") ;
    }
};

 程序编译报错:

 

 

三 、在程序中进行异常处理

【异常处理格式】

try {
    //有可能出现异常的语句
}catch (异常类 异常对象){
    //编写异常的处理语句
}catch (异常类 异常对象){
    //编写异常的处理语句
}finally {
    //一定会执行到的程序代码
}

(1)程序在 try 中捕获到异常,就会自动跳转到 catch 语句中匹配duiy对应的异常类型进行相应的处理,最后程序是否产生异常,则肯定都会执行 finally 语句。

(2)finally 块是可以省略的,如果省略了 finally 块,则try-catch块后程序继续执行

【异常处理流程图】

对异常进行捕获处理:

public class ExceptionDemo02 {
    public static void main(String args[]){
        System.out.println("********** 计算开始 ***********") ;
        int i = 10 ;		// 定义整型变量
        int j = 0 ;			// 定义整型变量
        try {
            int temp = i / j ;	// 此处产生了异常
            System.out.println("两个数字相除的结果:" + temp) ;
        }catch (ArithmeticException e){
            System.out.println("异常信息:" + e);
        }
        System.out.println("********** 计算结束 ***********") ;  

    }
};

程序运行结果:

 加入 fianlly 块:

public class ExceptionDemo02 {
    public static void main(String args[]){
        System.out.println("********** 计算开始 ***********") ;
        int i = 10 ;		// 定义整型变量
        int j = 0 ;			// 定义整型变量
        try {
            int temp = i / j ;	// 此处产生了异常
            System.out.println("两个数字相除的结果:" + temp) ;
        }catch (ArithmeticException e){
            System.out.println("异常信息:" + e);
        }finally {
            System.out.println("异常统一出口:不管程序是否有异常,都执行此代码");
        }
        System.out.println("********** 计算结束 ***********") ;

    }
};

程序运行结果:

 问题一:以上程序处理了一个异常,当然在程序的开发中一般不止存在一个异常,会同时产生多个异常,此时,就可以使用多个 catch 语句进行处理:

比如现在修改以上程序,加入 Integer.parseInt() 方法,对字符串参数进行转换,此时如果参数为非纯数字的字符串,程序就会出现 NumberFormatException 异常,如果参数为数字0,会出现 ArithmeticException 异常,此时可以使用多个 catch 语句分别处理不同的异常

public class ExceptionDemo02 {
    public static void main(String args[]){
        System.out.println("********** 计算开始 ***********") ;
        try {
            int i = Integer.parseInt("10") ;
            int j = Integer.parseInt("a") ;
            int temp = i / j ;	
            System.out.println("两个数字相除的结果:" + temp) ;
        }catch (ArithmeticException e){
            System.out.println("异常信息:" + e);
        }catch (NumberFormatException e){
            System.out.println("异常信息:" + e);
        }
        System.out.println("********** 计算结束 ***********") ;

    }
};

程序运行结果: 

 

 

 问题二:使用多个catch语句可以分别处理多个不同的异常,但是在程序的开发过程中很难知道到底会有几个异常,那么该如何解决这个问题呢?

 四 、异常类的继承结构

查看JDK文档可以发现,上面程序出现的异常ArithmeticException 、NumberFormatException 均是 Exception 的子类

 

Exception Throwable 的直接子类

Exception :一般表示的是程序中出现的问题,可以直接使用 try...catch 处理

Error:一般指 JVM 错误,程序中无法处理

 

 

了解了异常类的继承结构后,再了解一下Java的异常处理机制,两者结合,从中寻找上面问题二的解决方法

 五 、Java的异常处理机制

【1】一旦产生异常,则首先会产生一个异常类的实例化对象

【2】在 try 语句中对此异常对象进行捕捉

【3】产生的异常对象与 catch 语句中的各个异常类型进行匹配,如果匹配成功,则执行 catch 语句中的代码

 

六 、使用 Exception 进行异常处理

从对象多态性可以发现,利用向上转型的概念,子类实例可以由父类接收,即所有的异常对象都可以使用 Exception 接收

 使用 Exception 处理异常做法一:先对已知异常分别进行处理(实际开发有时需要对某个异常单独自定义处理),最后使用Exception捕获其它未知异常并处理:

注意:此处理方式的 catch 语句,范围小的异常(比如某个具体的异常)必须放在范围大的异常(比如Exception)之前,否则出现编译错误

提示:Exception 类中提供了一个 printStackTrace() 打印异常信息的方法

public class ExceptionDemo02 {
    public static void main(String args[]){
        System.out.println("********** 计算开始 ***********") ;
        try {
            int i = Integer.parseInt("10") ;
            int j = Integer.parseInt("a") ;
            int temp = i / j ;	// 此处产生了异常
            System.out.println("两个数字相除的结果:" + temp) ;
        }catch (ArithmeticException e){
            e.printStackTrace();
        }catch (NumberFormatException e){
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("********** 计算结束 ***********") ;

    }
};

 程序运行结果:

 

使用 Exception 处理异常做法二:所有异常使用Exception处理

public class ExceptionDemo02 {
    public static void main(String args[]){
        System.out.println("********** 计算开始 ***********") ;
        try {
            int i = Integer.parseInt("10") ;
            int j = Integer.parseInt("0") ;
            int temp = i / j ;	
            System.out.println("两个数字相除的结果:" + temp) ;
        }catch (Exception e){   //使用Exception进行处理 
            System.out.println("异常信息:" + e);
        }
        System.out.println("********** 计算结束 ***********") ;

    }
};

不管出现任何异常,统一使用 Exception 进行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值