Java中的异常继承体系
/**
* 异常可以作为判断一门编程语言是否成熟的标准,Java的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。
* 当程序运行出现意外情形时,系统会自动生成一个Exception对象来通知程序,从而将"业务功能实现代码"和"错误处理代码"
* 分离,提供更好的可读性。
* Java的异常机制主要依靠五个关键字来实现:try catch finally throws throw
*
* throws 和 throw 的区别:
throws 用在方法定义上,紧跟方法名,用来给方法添加一个异常的声明,说明抛出的异常类型(异常可以是多个,用逗号隔开;如果多个异常之间存在继承关系,只写父类异常即可)
throw 用在方法定义中,后面跟一个异常对象(可以是编译期异常,可以是运行期异常),用来抛出一个异常
public void show throws Exception(){
throw new Exception("出现异常"); //调用Exception中的带参构造
}
异常处理的两种方式:
第一种:直接抛出,这种方式并未真正的处理异常,只是抛给了上层调用者
public void show() throws 异常类名{
可能出现问题的代码;
}
第二种:try...catch
*/
public class Demo {
public static void main(String[] args) {
/**
* 格式一(最常用):
*/
try {
// 可能出现异常的代码块
} catch (Exception e) { //小括号里面跟的是(异常类名 变量名)
// 异常处理代码快,一般是打印错误信息 e.printStackTrace;处理异常的一种方式,有可能不执行
} finally {
//用于关闭在try代码块里面打开的物理资源,如果没有,可以不写finally
//异常机制决定了finally块里面的代码一定会被执行
}
System.out.println("程序结束");
/**
* 格式二:
*/
try {
}catch(异常类型1 | 异常类型2 |异常类型3... 变量名){
/**Exception1 | Exception2 |Exception3 为不同的异常分类
* 当try代码块中可能出现不同类型的异常时,我们可以在catch中针对
* 所有可能出现的异常都写在这儿,系统会自动匹配对应的异常进行处理
*/
}
System.out.println("程序结束");
/**
* 格式三:与格式二不同的是,格式三异常类型之间可以有继承关系,但是小的异常类型必须放在前面
*
*
*/
try {
} catch (异常类型1 e1) {
// TODO: handle exception
} catch (异常类型2 e2) {
} catch (异常类型3 e3) {
}......
System.out.println("程序结束");
/**
* 格式四:省略catch,这种格式确认没有什么异常要抓取,此时是为了强制执行finally里面的代码
*/
try {
} finally {
}
System.out.println("程序结束"); //由于没有处理异常,所以这段代码不会执行
/**
* 注意: 1、异常处理try必须有,并且不能只有try
* 2、如果父类方法中没有异常,子类中有异常,那么子类异常不能用throws抛出,只能用try...catch...处理;
* 如果父类中有异常,子类中也有异常,并且二者异常也有继承关系,则子类异常不能大于父类异常,如果没有继承
* 关系,则异常类型随意
* 3、异常三个代码块里声明的变量都是局部变量,只在该代码块内有效
*/
/**
* 自定义异常:我们使用的都是jdk定义好的,但是有时候我们根据实际需要自定义异常,比如如果你不是地球人,要抛异常;
* 自定义异常格式:
* 编译时异常: 需要定义类继承自Exception
* 格式: public class 类名 extends Exception{...}
*
* 运行时异常: 需要定义类继承自RuntimeException
* 格式: public class 类名 extends RuntimeException{...}
*/
}
}