异常的概述:
java程序运行过程中,出现的不正常情况,出现的错误,称为异常
异常的体系:
Throwable:
可抛出的,是异常体系的顶层父类,其他的异常或者错误都是Throwable的子类类型
只有Throwable的体系类型,才可以使用异常的处理机制
Error
错误,是Throwable的子类,用于描述那些无法捕获和处理的错误情况
属于非常严重的错误,没救了,等死吧
StackOverflowError 栈溢出
Exception
异常,是Throwable的子类,用于描述那些可以捕获和处理的例外情况
属于不太严重的错误,还可以抢救一下。。。。。。。。
ArrayIndexOutOfBoundsException 数组越界异常
RuntimeException
运行时异常,是Exception的特殊的子类,在编译阶段不做检查的一个异常
体系图:
在jvm中默认处理异常的机制
1、在代码的某个位置,出现了和正常情况不同的情况,就将异常情况封装到一个异常对象中。
2、将异常对象抛给调用该方法的方法
3、某个方法接收到底层方法抛上来的异常,也没有办法自己处理,继续向上抛出,
最终抛给主方法,主方法也没有办法处理,抛给调用自己的jvm虚拟机
4、Jvm虚拟机是我们手动调用的,只能将异常对象的所有信息,通过错误流打印出来,
结束jvm虚拟机
5、总结,jvm默认处理的方式:【一层一层向上抛,jvm接收到之后结束自己】
手动处理异常的方式
继承体系中的常用方法
1、发现在异常的继承体系中,所有的方法定义在了Throwable这个顶层父类中,
子类中几乎没有什么特有方法
2、Throwable中的构造方法:
Throwable():创建一个没有任何参数的异常对象
Throwable(String message):创建一个带有指定消息的异常对象
Throwable(Throwable cause):创建一个有原因异常的异常对象
3、常用成员方法:
getCause():获取异常对象中的原因异常,也就是当前异常对象的一个成员变量
getMessage():获取异常的详细信息
toString():获取异常对象的详细信息
printStackTrace():打印异常的调用栈轨迹(有关异常的方法调用路径)
自定义异常
1、jdk中提供了很多的异常类型,其中的绝大部分都没有自己特有的方法
2、定义这么多异常,没有特有方法、没有特有属性,原因:
1.如果有了很多的异常类型的名字,将来在不同的异常情况下,就可以使用不同的异常类型
创建对象。一旦发生了异常,可以很容易通过异常的类名来判断到底发生了什么异常情况
2.如果有了很多的异常类型,不同的异常类型,就可以有不同的处理方式
3、在自己的业务中,jdk提供的各种异常,都无法描述当前的异常情况,就需要我们自己定义异常
类型,用在自己的项目的业务中。
4、自定义异常的步骤:
1、定义一个类,以Exception结尾,IllegleAgeException,表示是一个非法年龄异常
2、让自己定义的这个类,继承一个Exception或者是RuntimeException
如果定义的是编译时异常,就使用Exception
如果定义的是运行时异常,就使用RuntimeException
3、构造方法不能被继承,需要手动添加
总结七问:
1.简述什么是异常、异常的继承体系?
2.简述异常的处理方式?
3.throw和throws关键字的使用位置和格式?
4.多个catch处理的注意事项?
5.简述finally关键字的特点和作用?
6.Throwable类的常见方法及方法描述?
7.自定义异常的步骤?