异常:在java中用类的形式对不正常情况进行了描述和封装,将正常流程代码和问题处理代码进行分离,提高阅读行。
问题很多,意味着描述的类很多,将其共性进行向上抽取,形成了异常体系。
不正常情况分成了两大类:
Throwable:
|——1、不可处理的:Error。
特点:比如运行文件不存在,内存溢出,这是错误不是异常。由JVM抛出的严重性问题,一般不处理,直接修改程序。
|——2、可以处理的:Exception。
特点:可抛通过throws和throw体现,Throwable及其子类都具有可抛型
发生异常时,下面的代码不再执行,把问题不断抛给调用者,直到抛到JVM(从栈顶不断往底下抛)。
异常的分类:
1、编译时被检测异常:Exception何其子类中都是,除了RuntimeException异常体系。
2、编译时不检测异常(运行时异常):Exception中的RuntimeException和其子类(这种问题发生程序无法运行,更多是调用者的原因导致的或者引发了内部状态的改变,一般不处理,直接编译通过,在运行时让调用者的程序强制停止,让调用者对代码进行修正 )。
所以要么继承Exception(检查),要么继承RuntimeException(不检查)
throws和throw的区别:
1、throws使用在函数上,throw在函数内。
2、throws抛出的是异常类,可以抛出多个,用逗号隔开。
throw抛出的是异常对象,一次只能抛一个。
3、throw一般在函数内部看不到,因此得用throws声明。
异常处理的捕捉形式:
try {
需要被检测异常的代码
} catch ( 异常类 变量 ) {
处理该异常的代码
} finally {
一定会被单独执行的代码
}
代码放在try块中作用域会变小。当try检测到异常时,不会执行try中下面内容,直接执行catch中内容。
finally:除非关闭JVM,否则一定会执行的代码
三种用法:
1、try-finally:异常无法直接catch处理,但资源在try中开启却需要在finally中关闭
2、try-catch-finally
3、try-catch
异常的转换/封装:将自己熟悉的问题进行处理,并将调用方进行告知(JDBC)。
异常处理的原则:
1、函数如果抛出需要检测的异常,呢么函数必须要声明,否则用try-catch,否则编译失败
2、如果调用了声明异常的函数,要么try-catch要么throws,否则挂掉
3、功能内部可以解决用catch,解决不了用throws给调用者解决
4、一个功能如果抛出了多个异常,那么调用时必须对应多个catch进行针对性处理
内部有几个要检测的异常,就抛几个,抛几个,就catch几个
异常的注意事项:
1、子类覆盖了父类方法时,父类方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。
2、如果父类抛出多个异常(ABC),子类只能抛子集(ABC、A、B、C、AB、AC、BC)。
3、父类/接口没有抛出异常,子类绝对不能抛出异常。