本章教学内容:
7.1异常处理基础
7.1.1异常概述
1.什么是异常
异常也称为例外,是指在程序的运行过程中所发生的一种事件,它会导致正常的程序流程中断。如:除数为0,数组越界,文件找不到等都属于异常。
7.1.2异常类的层次
在JDK中,每个包中都定义了异常类,而所有的异常类都直接或间接的继承于Throwable类。
7.1.3异常分类
从理论的角度,Java中的异常类可分为两大类:
Error(错误):描述了JVM系统的内部错误、资源耗尽等严重情况,这种错误一般是由JVM抛出的,Java应用程序不应该处理这种异常。
Exception(异常):因编程错误或偶然的外在因素导致的一般性问题,例如:对负数开平方根、空指针访问、试图读取不存在的文件、网络连接中断等。它包括非检查型(unchecked)异常和检查型(checked)异常。
1.非检查型异常 :继承于RuntimeException类的类属于非检查型异常。例如算数异常、数组下标越界异常等。由于这些异常产生的位置是未知的,编译器允许程序员在程序中不对它们作出处理。
2.检查型异常 :该类异常是除了非检查型异常之外,其他由Exception继承来的异常类。编译器要求在程序中必须处置该类异常。
7.2异常处理
7.2.1异常处理机制
Java语言提供两种处理异常的机制:
捕获异常:在程序运行过程中系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码,当找到能处理该类型对象的代码后,Java运行环境就把当前异常对象交给该代码进行处理,该过程称为捕获(catch)异常。这是一种积极的异常处理机制。如果Java运行环境找不到可以捕捉异常的代码,则运行环境将终止,相应的Java程序也将退出。
声明抛出异常:当Java运行环境得到一个异常对象,如果当前方法并不知道如何处理所出现的异常或者此时处理不合适,则可在定义方法时,声明抛出(throws)异常。
7.2.2捕获异常
实例7-2算术异常测试举例。
publicclass ExceptionDemo2 {
public static void main(String[]args){ // 0做除数
try{
int a=0;
int b = 5/a;
System.out.println("结果是:"+b);
}catch(ArithmeticException e){
System.out.println("0做除数无意义!");
e.printStackTrace();
}
}
}
由 try、catch与 finally 三个关键字所组成的程序块能够捕获异常,其中finally部分可以省略。其语法如下:
try {
//可能发生异常的代码段
} catch(异常类名 参变量名){
//对异常进行处理的代码段
}finally{
// 不管有没有异常总是要被执行的代码段
}
执行流程:
(1)try 程序块若是有异常发生时,程序的运行便中断,并抛出“异常类所产生的对象”。
(2)抛出的对象如果属于 catch()括号内欲捕获的异常类,则 catch会捕捉此异常,然后程序进入到 catch块里继续运行。
(3)无论 try块是否有异常发生,或者捕捉到的异常是否与 catch()括号里的异常相同,最后一定会运行 finally块里的程序代码。
finally的程序代码块运行结束后,程序再回到 try-catch-finally块之后继续执行。
7.2.3声明抛出异常
1.throws语句
throws语句的格式如下:
返回值类型 方法名() throws ExceptionType1,ExceptionType2 {
//方法体
}
说明:声明抛出异常是在一个方法头部由throws子句指明的;throws子句同时可以指明多个异常,之间由逗号隔开。
2.throw语句
抛出异常就是产生异常对象的过程。异常或者由JVM产生、或者由某些类的实例生成,也可以在程序中生成。在方法中,抛出异常是通过throw语句实现的。
7.3自定义异常类
尽管Java本身提供了很多异常处理类,但是当这些异常不能明确的说明异常情况时,开发人员往往需要定义一些自己的异常类来描述自身程序中的异常信息,以区分其他程序的异常信息。这种情况下用户只要定义一个直接或间接继承Throwable的类就可以了。
自定义异常类的主要作用是区分异常发生的位置,当用户遇到异常时,根据异常名就可以知道哪里有异常,根据异常提示信息进行修改。