十六、异常Exception
1.概念
异常:非正常情况,包括空的引用、数组下标越界、内存溢出等
Java提供了异常对象描述这类异常情况。
Java提供了异常机制来进行处理,通过异常机制来处理程序运行期间出现的错误,可以更好地提升程序的健壮性
2.异常处理基本流程
(1)try{
}catch(......){
}
异常处理过程:
·当执行过程中遇到异常时,系统会抛出异常(对象)
·catch()块捕获异常并处理
·没有被捕获的异常最终都将由默认处理程序进行处理
注意:
·由try保护的语句必须使用{}括起来,catch也不能省略{}
·try、catch不能单独使用
·try块发生异常之后直接进入catch块,执行完catch块后也不会返回到try块
(2)try{
}catch(......){
}catch(......){
}
注意:
·try及其catch语句构成了一个单元,catch子句的作用域被限制在由之前try语句指定的那些语句
·执行了一条catch语句之后,会忽略其他catch语句,并继续执行try/catch块后面的代码
·当使用多条catch语句时,要重点记住异常子类必需位于它的所有超类之前
(3)try{
}finally{
}
注意:
·不管是否有异常抛出,都会执行finally块
·最多只能有一个finally块
·每个try语句至少需要有一个catch子句或一个finally子句
3.嵌套的try语句
一个try语句可以位于另一个try语句中
4.异常类型
(1)异常继承体系
(2)异常分类
·运行时异常(unchecked异常):所有RuntimeException类及其子类的实例
不要求必须进行异常捕获处理或抛出声明
·非运行时异常(checked异常)(编译异常):运行时异常之外的异常
必须显式处理异常
处理方式:
·使用try...catch块来捕获异常,然后在对应的块来修复异常
·定义方法时抛出异常
(3)常用异常
java.lang包中定义的运行时异常 | |
异 常 | 含 义 |
ArithmeticException | 算术错误,例如除零 |
ArrayIndexOutOfBoundsException | 数组索引越界 |
ArrayStoreException | 使用不兼容的类型为数组元素赋值 |
ClassCastException | 无效的转换 |
EnumConstantNotPresentException | 试图使用未定义的枚举值 |
IllegalArgumentException | 使用非法实参调用方法 |
IllegalMonitorStateException | 非法的监视操作,例如等待未锁定的线程 |
IllegalStateException | 环境或应用程序处于不正确的状态 |
IllegalThreadStateException | 请求的操作与当前线程状态不兼容 |
IndexOutOfBoundsException | 某些类型的索引越界 |
NegativeArraySizeException | 使用负数长度创建数组 |
NullPointerException | 非法使用空引用 |
NumberFromatException | 字符串到数字格式的无效转换 |
SecurityException | 试图违反安全性 |
StringIndexOutOfBounds | 试图在字符串边界之外进行索引 |
TypeNotPresentExcepton | 未找到类型 |
UnsupportedOpetationException | 遇到一个不支持的操作 |
java.lang包中定义的非运行时异常 | |
异 常 | 含 义 |
ClassNotFoundException | 未找到类 |
CloneNotSupportedException | 试图复制没有实现Cloneable接口的对象 |
IllegalAccessException | 对类的访问被拒绝 |
InstantiationException | 试图为抽象类或接口创建对象 |
InterruptedException | 一个线程被另一个线程中断 |
NoSuchFieldException | 请求的字段不存在 |
NoSuchMethodException | 请求的方法不存在 |
ReflectiveOperationException | 与反射相关的异常的子类(该异常是由JDK 7新增的) |
常用的非运行时异常 | |
异 常 | 含 义 |
IOException | 输入输出异常 |
FileNotFoundException | 文件不存在异常 |
SQLException | SQL异常 |
5.throw
使用throw语句显式地抛出一个异常,在throw语句之后的执行流会立即停止,所有后续语句都不会执行,然后检查最近的try块,查看是否存在和异常类型相匹配的catch语句
6.throws
如果方法可能引发一个Checked异常,则必须在方法声明中提供throws子句列出了方法可能抛出的异常类型
throw与throws的区别:
·throw抛出异常对象,应用在代码块内
·throws声明可能抛出的异常类型,在定义方法后面
·如果方法内使用throw抛出Checked异常对象,又没有进行try catch处理,则该方法定义同时需要使用throws指明抛出异常类型