----异常的概述-----
1.异常,就是不正常的现象,可能发生在编译期间也可能发生在运行期间
2.可能会出现不同的异常,进而在Java中对其描述封装为类--在这些异常类中抽取其共性的东西(异常发生的位置,名称等)--形成了异常体系的根类Throwable(可以抛出的异常)
3.Throwable下面分为两大子类:Exception(可以进行处理) Error(严重情况,必须对程序修改)
4.关于异常体系的一些总结
* 异常的子类后缀名是以其父类名确定的,分别以Exception、Error结尾
* 异常类的构造方法有两个,无参数、有字符串的(描述异常信息)
* 异常类的方法都是从其父类Throwable中继承的
* 异常体系的出现将异常发生与异常的处理分开,使得代码具有阅读性
-----异常处理的具体过程描述------两种情况
1.对于Java已经定义的异常类其过程如下:
eg:前提调用情况 JVM掉用main-->main调用method(method发生下标越届)
main进栈-->mthod进栈-->执行到异常发生的地方且JVM自动识别出该异常并封装该对象
将其抛出throw new IndexOutOfBoundsException();
将异常对象抛给调用者main,method出栈,main接受到异常对象并不处理
将该异常对象传递给JVM,main出栈JVM打印出异常对象的相关信息(类型,发生位置)
注意事项:
发生异常后就不会按照正常流程执行程序,而是会按照异常处理执行程序
异常具有能够结束函数执行的功能--原因是问题发生所以停止
异常信息的打印:按照函数出栈的顺序打印
异常的抛出,会抛出给调用者,调用者如果不处理,就会继续向上直到JVM,打印异常信息,此时程序就是真正的停止
除了JVM自动识别抛出异常,当然也可以手动的抛出异常对象
异常一般的处理流程:问题方法发生异常--出栈--调用者处理/交给上层处理/JVM
真实开发不会直接打印异常的信息,而是会将异常信息全部存储在一个文件里面--日志,开发者会对日志进行定期的查看,并集中的根据异常的情况,对程序进行修改和维护
2.对于Java中未进行定义的异常事件可以进行自定义异常
----怎样进行自定义异常----
必须继承异常体系,这样才有资格被抛出,进而被JVM识别
对于发生异常的方法本身必须在函数上进行声明异常对象,在函数内部对异常对象进行抛出
对于调用者可以有两种处理方式(假设该异常是必须检验的异常):
*声明异常,自己不进行处理--继续向上抛给JVM
*,接收异常对象,处理异常
----关于Exception类子类的划分----两大类
* RuntimeException及其子类:编译器不检测的异常,可以不声明,编译也可以通过
* 其他的Excetion异常类的子类:编译器必须检测的异常,必须进行声明,否则编译不通过
----关于自定义异常类继承谁为其父类-----
* 因为调用者导致以及其他情况下引起的内部状态改变的时候应该定义为运行时异常,通常会让调用者对代码进行修改
* 其他的情况一般就直接定义为Exception类的子类--可以提前的给出相应的解决办法
* 以后开发中更多遇见的是运行时异常(正在运行然后中断),而Error直接就是JVM无法工作
----throws throw区别----
* throws用于在方法上进行声明异常对象,可以同时声明多个异常对象
* throw 用于在方法内部抛出异常对象,一次只可以抛出一个异常对象
-----异常的捕获-----
1.利用try{可能发生异常的代码;}catch(异常类型 异常名){异常处理过程}finally{一定会被执行的语句}结构进行异常处理
2.异常处理的基本原则
* 函数内容如果抛出必检验的异常,函数必须先声明,在利用try-catch处理/继续声明抛出
* 对于发生的异常可以处理用catch,不可以处理就throws向调用者说明
* 一个功能抛出多个异常,必须用对应的catch块进行接收异常对象并做出处理(一般先捕获小的异常再捕获大的异常),实际过程中并不会进行超出异常对象个数的捕获
* finally语句作用--一定会被执行的代码
用于数据库连接,查询,关闭资源连接等
* 假如调用者接收到异常对象也处理不了,可以在catch中继续抛出该异常对象给上级
----异常处理的注意事项------
1.子类在覆盖父类方法时候,父类方法如果抛出异常,子类重写的方法只能抛出父类抛出的异常类或其子类
2.父类如果抛出多个异常,子类只能抛出父类异常类个数的子集
3.父类方法没有发生异常,覆盖的时候子类只能自己处理,不能向外抛出异常