一、什么是异常

1.1 Java中的异常

我们每天开车去上班,都有可能碰到堵车、撞车等情况发生,在使用电脑时,突然断电或蓝屏等情况时有发生,这些突发情况就是异常。在程序运行过程也会出现非正常状况,如磁盘空间不足、网络连接中断、除数为零等,这些在程序运行过程发生的不正常的事件就是程序的异常,它会中断正在运行的程序。
【例1.1-01】阅读下列程序
image.png
image.png
当b的值为0时,发生异常,并中断了程序的执行。

1.2 Java中常见的异常类

方 法 名 说 明
Exception 异常层次结构的根类,代表以下所有异常
ArithmeticException 算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 尝试访问 null 对象成员
ClassNotFoundException 不能加载所需的类
InputMismatchException 欲得到数据类型与实际输入类型不匹配
IllegalArgumentException 方法接收到非法参数
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式转换异常,如把”abc”转换成数字

二、异常处理机制

当开车上班时在路碰到堵车等突发情况,我们可能已经想好了预备方案,绕行或等待,绝不会因为会出现突发情况而影响出行或上班。同理,当程序发生异常时,我们也应在程序中预先想好了对付异常的处理办法 ,使程序正常运行,这就是程序的异常处理机制。
Java异常处理有三种机制:捕获异常、声明异常和抛出异常。

2.1 捕获异常

1、使用try-catch块捕获异常
try {
// 代码段(有可能产生异常的代码)
// 如果代码发生了异常,中断程序的执行,进入catch代码块。
} catch (异常类型 e) {
//捕获了异常,对异常进行处理的代码段
}
【例2.1-01】捕获异常
image.png
2、在catch块中处理异常
调用异常对象的方法输出异常信息

方法名 说 明
void printStackTrace() 输出异常的堆栈信息
String getMessage() 返回异常信息描述字符串,是printStackTrace()输出信息的一部分

image.png
3、finally代码块
在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行。
try {
// 代码段(有可能产生异常的代码)
// 如果代码发生了异常,中断程序的执行,进入catch代码块。
} catch (异常类型 e) {
//捕获了异常,对异常进行处理的代码段
}finally{
// 无论是否发生了异常,必须执行的代码段
}
【例2.1-02】finally代码块
image.png
image.png

2.2 声明异常

如果方法中代码发生异常,编写者不想在方法中处理或者不能在方法中处理,将异常处理的权限交给调用者,Java允许在方法中允许声明可能发生的异常,由调用者在调用方法时,强制其捕获异常。
方法() throws Exception{
// 代码
}
【例2.2-01】声明异常
image.png

2.3 抛出异常

在程序中,除了系统自动抛出异常外,有些问题需要程序员自行抛出异常。
throw new Exception(异常信息)
一般在方法中抛出异常,并在方法声明异常。
【例2.3-01】抛出异常
image.png

三、异常分类

image.png

  • Error:错误类,表示Java程序运行时资源耗尽或系统内部错误,这类错误属于严重错误,程序本身不能修复。
  • Exception:异常类,程序本身是可以处理的错误。
    • 编译时异常:除了RuntimeException异常都是编译时异常。Java会对异常进行检查,如果有异常就必须对异常进行处理,否则编译不能通过,这类异常也称为checked异常。
    • 运行时异常:RuntimeException异常,Java编译器不会对此类异常进行检查,不需要进行异常处理,是程序在运行过程发生的逻辑错误,也称为非checked异常。

【练习】
1、从控制台输入1~3之间任一个数字,程序将输出相应的课程名称,【1、C# 2、Java 3、C++】根据键盘输入进行判断:
(1)如果输入正确,输出对应课程名称,否则,提示输入错误。
(2)不管输入是否正确,均输出“欢迎提出建议”语句 。
2、编写一个设置学生年龄的方法,在setAge(int age) 中对年龄进行判断:
(1)如果年龄介于18到30之间直接赋值,否则抛出异常。
(2)在测试类中调用setAge(int age)方法,使用try-catch捕获并处理异常。