目录
1 异常的产生和分类
异常是对不正常现象的封装(Throwable)
【1】
严重问题Error
不可修复,程序员处理不了,也不作处理
举例
NoClassDefFoundError
OutOfMemoryError
不严重问题Exception
- 编译时异常 (Checked Exception)
是一类异常的称,如果发生异常,则在程序编译时发生,只要异常不是运行时异常,都是编译时异常。 - 运行时异常 RuntimeException(Unchecked Exception)
- 二者区别
a) 检测时机:
前者在编译时检测,后者在运行时检测、
b) 程序中对异常的处理方式:
前者需要捕获或者向上层调用链抛出,后者可以不用捕获、不用向上层抛出。
若没有对异常进行处理,:
前者在编译时提示“未报告的异常 xxxxException;必须对其进行捕获或声明以便抛出”,
而后者在运行时会显示对应的运行时异常类型的全名,以及异常发生的原因。
——无论语句的编译时异常能不能发生,只要其存在编译时发生的可能性,就必须处理
——可以通过创建自定义异常,来对已知异常进行个性化具体化的处理。
举例:
常见的编译时异常
1.FileNotFoundException
2.ClassNotFoundException
3.SQLException
4.NoSuchFieldException
5.NoSuchMethodException
常见的运行时异常
1.NullPointerException
2.ArithmeticException
3.ClassCastException
4.ArrayIndexOutOfBoundsException
5.StringIndexOutOfBoundsException
2 异常处理
(1) 捕获异常(try…catch…finally)
1) 包含的结构 try,catch,finally
-
try
{
可能出现异常的代码
} -
catch(Exception e) //实际是 Exception e=new 产生的异常名()
①捕获异常e,并对捕获的异常进行处理:(如提示异常信息)
– e.getMassage()//该异常的定义
– e.toString()//异常的名称+定义
– e.printStackTrace()// 异常的名称+定义+栈中保存的错误语句位置. 是默认的异常处理方式② 捕获异常A,抛出异常B
catch(AException e)
{
throw new BException();
} -
finally
{
必须执行的代码,如关闭IO流
}
2) 三种形式
try{} catch(){}fianlly{}
try{} catch(){}
try{} finally{}
3) 注意:
-
finally中的内容只有一种情况下不会执行——在catch中 遇到 System.exit(0);*
-
catch块中出现throw 或者return ,则try catch finally 体系后的代码不执行
-
异常为RuntimeExceptin 的,执行到异常发生的代码,其后的代码不再执行*
(2) 抛出异常(throw)
1)是抛出自定义异常的关键字,方法体内抛出
throw new MyException("");
2)在包含该关键字的方法中,方法声明右侧需要 throws
只抛出RuntimeException 对象及其子类对象时,不用进行throws声明
3)对于抛出异常的方法,在调用链的上层需要try…catch 捕获,也可以继续向上抛出异常
(3)声明异常(throws)
1)在某个方法声明的右侧标识,表示调用该方法时,可能出现异常,并向调用该方法的上一层方法抛出异常
但仅仅写了throws而直到最顶层的方法还没有处理的情况下,编译时会提示未报告的异常,必须对其进行捕获或声明以便抛出。
- 在最高层(或其前面进行try…catch自定义处理
- 声明即在该方法的方法调用链上都加上throws声明
- 调用链:出现问题的方法…-> main方法---->虚拟机
2)可以同时声明多个异常
4 异常处理的原则
(1) 异常捕获和抛出时,异常的类型要具体化
- 在距离相近的代码中,异常不可能同时发生,因为一旦一个异常发生,剩下的代码不会执行
- 父类异常可以接收子类异常,多态
- catch时需要把具体的写在靠上的位置,父类catch块放在最下方
(2) 有几个异常声明,就对应几个catch块
(3) 对用户友好
- 错误日志
- 捕获或者抛出都是为开发人员准备的
5 编译时检测的异常 (CheckedException)
- 必须处理
- 对抛出异常的方法,必须在方法声明处声明异常throws
- 可以在调用链上 用try…catch 捕获处理
6 运行时异常 RuntimeException
-
在某些语句产生异常,致使接下来的程序无法继续运行的情况下, 定义的异常称为运行时异常
-
运行时异常可捕获可不捕获, 一般不建议捕获,而是需要对代码(方法传递的实参)进行修正
-
抛出运行时异常的方法,无需进行异常声明
7 异常的继承问题
子类中抛出的异常(子) 类型不能多于父类,但是可以“捕获“”除父类抛出的异常外的异常(进化论)
8 异常体系中代码的执行
9 参考文献
【1】异常的体系结构简介