异常Exception
概念
异常也就是非正常情况,比如使用空的引用、数组下标越界、内存溢出错误等,这些都是意外的情况,背离我们程序本身的意图。
Java提供了异常对象描述这类异常情况。
Java提供了异常机制来进行处理,通过异常机制来处理程序运行期间出现的错误。通过异常机制,可以更好地提升程序的健壮性。
可以将异常通俗的理解为“陷阱”,程序运行出现异常,就是掉到陷阱了。
注意:
Java异常是描述在一块代码中发生的异常情况(也就是错误)的对象。
第一种情况:
try{
}
catch(…){
}
大部分设计良好的catch子句,应当能够分辨出异常情况,然后继续执行,就好像错误根本没有发生一样。
异常处理过程:
(1)当执行过程中遇到异常时,系统会抛出异常(对象)
(2)catch()块捕获异常并处理。
(3)没有被捕获的异常最终都将由默认处理程序进行处理。默认处理程序会显示一个描述异常的字符串,输出异常发生点的跟踪栈,并终止程序。
提示:
l 由try保护的语句必须使用花括号括起来(即,它们必须位于一个块中)。不能为单条语句使用try。catch块也不能省略花括号。
l try块中发生异常之后直接进入catch块,执行完catch块后也不会再返回到try块。因此,try块中发生异常之后的语句都不会再执行。
第二种情况:多条catch子句
try{
}
catch(…){
}
catch(…){
}
提示:
l try及其catch语句构成了一个单元。catch子句的作用域被限制在由之前try语句指定的那些语句。
l 执行了一条catch语句之后,会忽略其他catch语句,并继续执行try/catch块后面的代码。
l 当使用多条catch语句时,要重点记住异常子类必需位于它的所有超类之前。
第三种情况:finally
try(){
}
/*可以有多个catch块*/
finally{
}
提示:
l 不管是否有异常抛出,都会执行finally块。
l 最多只能有一个finally块。
l 对于关闭文件句柄、以及释放资源,finally子句都是很有用的。
第四种情况:
try(){
}
catch(…){
}
catch(…){
}…
finally{
}
提示:
每个try语句至少需要有一个catch子句或一个finally子句。
一条try语句可以位于另外一条try语句中。
如果内层的try语句没有为特定的异常提供catch处理程序,执行流程就会跳出该try语句,检查外层try语句的catch处理程序,查看异常是否匹配。这个过程会一直继续下去,直到找到了一条匹配的catch语句,或直到检查完所有的try语句。如果没有找到匹配的catch语句,则Java运行时系统会处理该异常。
提示:
当涉及方法调用时,可以能会出现不那么明显的try语句嵌套。
Error一般指与JVM相关的错误,如系统崩溃、虚拟机错误、动态链接失败等。
Exception有一个重要子类RuntimeException。所有RuntimeException类及其子类的实例被称为运行时(Runtime)异常。对于您编写的程序而言,这种类型的异常是自动定义的,包括除零和无效数组索引这类情况。
运行时异常之外,称为非运行时异常/编译异常。
Throwable重写了(由Object定义的)toString()方法,从而可以返回一个包含异常描述的字符串。可以使用println()语句显示这个描述。
Java的异常分为两大类:checked异常和unchecked异常。
l unchecked异常(非检查异常),也称运行时异常(RuntimeException),比如常见的NullPointerException、IndexOutOfBoundsException。对于运行时异常,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。运行异常
l checked异常(检查异常),也称非运行时异常(运行时异常以外的异常就是非运行时异常)。Java认为Checked异常都是可以被处理(修复)的异常,所以Java程序必须显式处理Checked异常,否则无法通过编译。编译异常
含义:checked异常是指程序员比较进行检查,必须进行处理。
对于Checked异常的处理方式有如下两种:
l 当前方法明确知道如何处理该异常,则应该使用try…catch块来捕获该异常,然后在对应的块中修复该异常。
l 当前方法不知道如何处理这种异常,则应该在定义该方法时声明抛出该异常。
常用异常
unchecked异常 运行时异常
要求:看到异常类名,要知道表示哪种错误,知道属于哪类异常
java.lang包中定义的unchecked异常
异 常 | 含 义 |
ArithmeticException | 算术错误,例如除零 |
ArrayIndexOutOfBoundsException | 数组索引越界 |
ArrayStoreException | 使用不兼容的类型为数组元素赋值 |
ClassCastException | 无效的转换 |
EnumConstantNotPresentException | 试图使用未定义的枚举值 |
IllegalArgumentException | 使用非法实参调用方法 |
IllegalMonitorStateException | 非法的监视操作,例如等待未锁定的线程 |
IllegalStateException | 环境或应用程序处于不正确的状态 |
IllegalThreadStateException | 请求的操作与当前线程状态不兼容 |
IndexOutOfBoundsException | 某些类型的索引越界 |
NegativeArraySizeException | 使用负数长度创建数组 |
NullPointerException | 非法使用空引用 |
NumberFromatException | 字符串到数字格式的无效转换 |
SecurityException | 试图违反安全性 |
StringIndexOutOfBounds | 试图在字符串边界之外进行索引 |
TypeNotPresentExcepton | 未找到类型 |
UnsupportedOpetationException | 遇到一个不支持的操作 |
常用的checked异常 编译
IOExeption //输入、输出异常
FileNotFoundException //文件不存在异常
SQLException //SQL异常
java.lang包中定义的Checked异常(了解)
异 常 | 含 义 |
ClassNotFoundException | 未找到类 |
CloneNotSupportedException | 试图复制没有实现Cloneable接口的对象 |
IllegalAccessException | 对类的访问被拒绝 |
InstantiationException | 试图为抽象类或接口创建对象 |
InterruptedException | 一个线程被另一个线程中断 |
NoSuchFieldException | 请求的字段不存在 |
NoSuchMethodException | 请求的方法不存在 |
ReflectiveOperationException | 与反射相关的异常的子类(该异常是由JDK 7新增的) |