一. 异常的体系结构
java.lang.Throwable
① Error: 错误, 程序中不进行处理
② Exception: 异常, 要求在编写程序时, 就要考虑到对这些异常的处理
Ⅰ. 编译时异常: 在编译期间会出现的异常(执行javac.exe命令时, 出现的异常)
Ⅱ. 运行时异常: 在运行期间出现的异常(执行java.exe命令时, 出现的异常)
复制代码
当执行一个程序时, 如果出现异常, 那么异常之后的代码就不再执行!
二. 如何处理Exception的异常
Java提供的是异常的抓抛模型
1. "抓": 抓住上一步抛出来的异常类的对象. 如何抓? 即为异常处理的方式, 有两种:
① try-catch-finally
② throws + 异常类型
2. "抛": 当我们执行代码时, 一旦出现异常, 就会在异常的代码处生成一个对应类型的对象, 并将此对象抛出(自动抛出 / 手动抛出(throw + new 异常类))
一旦抛出此异常类的对象, 那么程序就终止执行
此异常类的对象抛给方法的调用者
java提供了两种方式用来处理一个异常类的对象
复制代码
异常类, 既可以是现成的异常类, 也可以是自己创建的异常类
三. 异常的处理方式:
方式一:
try{
// 可能出现异常的代码
}catch(Exption1 e1){
// 处理方式一
}catch(Exption2 e2){
// 处理方式二
}finally{
// 一定要执行的代码
}
注:
① try 内声明的变量, 类似于局部变量, 除了 try{} 语句, 就不能被调用
② catch 语句内部是对异常对象的处理: e.getMessage(); e.printStackTrace()
③ 可以由多个 catch 语句, try 中抛出的异常类对象从上往下去匹配 catch 中的异常类的类型, 一旦满足就执行 catch 中的代码. 执行完, 就跳出其后的多条 catch 语句
④ 如果异常处理了, 那么其后的代码继续执行
⑤ 若 catch 中多个异常类型是"并列"关系, 那么顺序前后都可以. 若 catch 中多个异常类型是"包含"关系, 须将子类放在父类的之前, 进行处理. 否则报错
⑥ finally 是可选的
⑦ finally 中存放的是一定会被执行的代码不管 try 中、catch 中是否仍有异常未被处理, 以及是否有 return 语句
⑧ try-catch 是可以互相嵌套的
方式二:
① 在方法的声明处, 显式的抛出该异常对象的类型
② 格式: 如: public static void method() throws Exception{}
③ 当在此方法内部出现异常的时候, 会抛出一个异常类的对象, 抛给方法的调用者
④ 异常的对象可以逐层向上抛, 直到main中. 当然在向上抛出的过程中, 可以再通过 try-catch-finally进行处理
复制代码
对于运行时异常来说, 可以不显式的进行处理
对于编译时异常来说, 必须要显式的进行处理
四. 如何自定义一个异常类
① 自定义的异常类继承现有的异常类
② 提供一个序列号, 提供几个重载的构造器
复制代码
public class MyException extends Exception{
static final long serialVersionUID = -70348975766939L;
public MyException(){}
public MyException(String msg){
super(msg);
}
}
复制代码
子类重写的父类的方法, 其抛出的异常类型只能是被重写的方法的异常类的子类或本身
其中, 要区分: throw 与 throws 的区别