异常就是程序在运行时出现了不正常的情况。
Java通过java类的形式对出现的问题进行描述,并封装成对象。
问题分为两种:
1.严重的问题
是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。
java通过对Error类进行描述,对于Error一般不编写针对性的代码对其进行处理。
2.非严重的问题
是程序本身可以处理的异常。
java通过Exception类进行描述,对于Exception可以使用针对性的处理方式进行处理。
java异常类层次结构图:
Error或者Exception都具有一些共性内容。都继承自Throwable这个异常的超类。
详情可查jdkAPI文档
1.单个异常捕捉
try{
需要被检测的代码
}catch(异常类 变量){
处理异常的代码:(处理方式)
}finally{
最后一定会执行的代码
注:在以下4种特殊情况下,finally块不会被执行:1)在finally语句块中发生了异常。2)在前面的代码中用了System.exit()退出程序。3)程序所在的线程死亡。4)关闭CPU。
}
图示try、catch、finally语句块的执行:
2.单个异常抛出
在功能上通过throws的关键字声明了该函数A有可能会出现问题。
通过函数B调用了用throws声明了的函数A,则函数B必须
对异常进行捕捉或者抛出,否则编译不通过。
Exception中有一个特殊的子类异常RuntimeExcetion(运行时异常)如果在函数内抛出异常,函数上可以不用声明,编译一样通过如果在函数上声明了该异常。调用该函数者可以不用进行处理,编译一样通过。之所以不用在函数声明,是因为不需要让调用函数者处理。当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
虚拟机认为不要处理,让程序停掉,改动程序之所以。
3.多个异常处理
声明异常时,建议声明更为具体的异常,这样处理的可以更具体。 对方声明几个异常,就对应有几个catch块,不要定义多余的catch块, 如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面 的异常出现继承关系。
因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象,所以对于这些特有的问题可以按照java对问题封装的思想,进行自定义描述。
当函数内部出现throw抛出异常对象,那么就必须要给相应的处理动作。
要么在内部try..catch处理。要么在函数上声明让调用者处理。
1.子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。
2.如果父类抛出多个异常,那么子类只能抛出父类异常的子集。----子类覆盖父类只能抛出父类异常或者子类或者子集。如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,只能try。