-
异常:
异常机制:是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误 后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
运行时发生的错误(java命令的错误)
代码的语法错误不是异常,是编译错误(javac错误) -
Throwable:有两个重要的子类:Exception和 Error,二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Error:是程序无法处理的错误,表示运行应用程序中较严重问题
Java虚拟机运行错误(Virtual MachineError)
类定义错误(NoClassDefFoundError)
Exception:是程序本身可以处理的异常
受检查异常
运行时异常:RuntimeException 类及其子类表示“JVM 常用操作”引发的错误
NullPointerException空值对象引用
ArithmeticException除数为零
ArrayIndexOutOfBoundException数组越界 -
可查异常(编译器要求必须处置的异常):正确的程序在运行中,很容易出现的、情理可容的异常状况。可查异常虽然 是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异 常状况,就必须采取某种方式进行处理。
除了RuntimeException及其子类以外其他的异常都是可查异常,这种异 常的 特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常, 要么 用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通 过。 -
不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。
-
非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度 讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、 SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
-
运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、 IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可 以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运 行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch 语句捕获它,也没有用throws子句声明抛出它,也会编译通过。交给虚拟机处理
-
捕获异常:try、catch 和 finally
try-catch语句
在Java中,异常通过try-catch语句捕获。其一般语法形式为:
try {
// 可能会发生异常的程序代码
} catch (Type1 id1){
// 捕获并处置try抛出的异常类型Type1
} catch (Type2 id2){
//捕获并处置try抛出的异常类型Type2
}
关键词try后的一对大括号将一块可能发生异常的代码包起来,称为监控区域。Java方法在运行过程中出现异常,则创建异常对象。将异常抛出监控区域之外而且try中其他代码不再执行,由Java运行时系统试图寻找匹配的catch子句以捕获异常。若有匹配的catch子句,则运行其异常处理代码,try-catch语句结束。
匹配的原则是:如果抛出的异常对象属于catch子句的异常类,或者属于该异常类的子类,则认为生成的异常对象与catch块捕获的异常类型相匹配。
注意:一旦某个catch捕获到匹配的异常类型,将进入异常处理代码。一经处理结束,就意味着整个try-catch语句结束。其他的catch子句不再有匹配和捕获异常类型的机会。(如果有多个异常块,父类应该放在下面)
把运行时异常的catch语句放在后面防止屏蔽其他特定异常处理引起错误
finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。
在以下4种特殊情况下,finally块不会被执行:
1)在finally语句块中发生了异常。
2)在前面的代码中用了System.exit()退出程序。
3)程序所在的线程死亡。
4)关闭CPU。 -
抛出异常:
throws抛出异常:如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常。 例如:methodname throws Exception1,Exception2,…,ExceptionN { }
当方法抛出异常列表的异常时,方法将不对这些类型及其子类类型的异常作处理,而抛向调用该方法的方法,由他去处理。
使用throws关键字将异常抛给调用者后,如果调用者不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的调用者。
throw抛出异常
throw总是出现在函数体中,用来抛出一个Throwable类型的异常。程序会在throw语句后立即终止,它后面的语句 执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。例:throw new exceptionname; 如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。 -
使用finally块释放资源 finally关键字保证无论程序使用任何方式离开try块,finally中的语句都会被执行。在以下三种情况下会进入finally块: (1) try块中的代码正常执行完毕。 (2) 在try块中抛出异常。 (3) 在try块中执行return、break、continue。 因此,当你需要一个地方来执行在任何情况下都必须执行的代码时,就可以将这些代码放入finally块中。当你的程序中使用了外界资源,如数据库连接,文件等,必须将释放这些资源的代码写入finally块中。
注意:在finally块中不能抛出异常。JAVA异常处理机制保证无论在任何情况下必须先执行finally块然后再离开try块,因此**在try块中发生异常的时候,JAVA虚拟机先转到finally块执行finally块中的代码,finally块执行完毕后,再向外抛出异常。**如果在finally块中抛出异常,try块捕捉的异常就不能抛出,外部捕捉到的异常就是finally块中的异常信息,而try块中发生的真正的异常堆栈信息则丢失了。
异常处理
最新推荐文章于 2024-09-09 08:54:06 发布