异常
学习目标
- 异常概述
- 异常的捕获
- 异常的声明
- 异常的抛出
- 补充
- 总结
- 习题
本章重点
try-catch基本格式
常见异常和对应的错误处理
异常概述:
- 程序异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
Java编程语言使用异常处理机制为程序提供了错误处理的能力
异常的捕获:
- try-catch
- try-catch-finally
特点:不管有没有发生异常都会执行finally,除非System.exit(1)
多重catch
- 特点:捕获代码块中不同的异常
- 引发多种类型的异常排列catch 语句的顺序:
- 先子类后父类
- 发生异常时按顺序逐个匹配
- 只执行第一个与异常类型匹配的catch语句
try-catch捕获的三种情况:
- 程序正常运行
- 程序发生异常,catch语句能匹配到类型,异常得到处理,还可以程序正常执行
- 程序发生异常,catch语句中异常类型未能匹配到,程序终止运行
分析异常
e.printStackTrace(),可根据打出来的堆栈信息分析
e.getMessage();可根据事先设置好的异常信息分析。
常见的异常类型
- Exception 异常层次结构的根类
- ArithmeticException 算术错误情形,如以零作除数
- ArrayIndexOutOfBoundsException 数组小于或大于实际的数组大小
- NullPointerException 尝试访问null对象成员
- ClassNotFoundException 不能加载所需的类(常见于多态中向下转型)
- InputMismatchException 欲得到的数据类型与实际输入的类型不匹配
- IllegalArgumentException 方法接收到非法参数
异常的声明
- 在一个方法执行的时候出现异常,方法本身不想处理,只想通知调用者,由调用者处理,此时可在方法上面声明一个异常
语法规则:
在方法头中使用throws关键字声明异常
例如:public void method()throws Exception{}
异常的抛出
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
- 语法规则:在方法体中使用throw抛出异常
例如:public void method()throws Exception{throw new Exception()}
异常分类(详细见异常继承图)
补充:
异常类别划分
- 运行时异常:一种Exception的特殊子类,他是RuntimeException或者RuntimeException的子类
**特点:调用声明有【RuntimeException】的方法,运行时异常不要求必须捕获或者声明
抛出** - Checked异常:非 RuntimeException或者子类
调用声明有【Checked异常】的方法,Checked异常必须捕获或者声明抛出
注意:方法中声明一个RuntimeException异常,调用者可捕获可不捕获异常,声明一个checked异常,调用者必须捕获异常
继承下的异常声明
- 理论支撑:方法重写(一致)
规则:
- 父类或者接口的方法【没有声明任何类型异常】,那么子类只允许
a)声明任何RuntimeException(RE的子类)
b)不声明任何Checked异常
- 父类或者接口的方法声明【运行时异常】,可认为他没声明异常,那么子类只允许
a)声明任何RuntimeException(RE的子类)
b)不声明任何Checked异常
- 父类或者接口的方法声明【Checked异常】,那么子类只允许
a)声明任何RuntimeException(RE的子类)
b)不声明任何Checked异常
c)父类的异常一样
d)父类异常的子类(变窄了)
总结:
- try-catch-finally语句注意点
- 多重catch语句注意点
- throws和throw的区别
习题:
- 写一个登录(login)的方法,方法中有两个String类型形参,分别是账户名密码,校验用
户账户名密码
,账户名不是”zhangshan”或者密码不是”123456”,则该方法向外抛出一个异常,异常信息
提示文字是“输入账户或者密码不正确”,
在main方法中从控制台接收用户输入的账户名和密码,调用login方法,捕获并且处理异常,
捕获用login打印出来。