异常处理,是Java中最强大,也是最容易被误用的机制。
使用异常的第一步是决定是否使用异常,异常并不是在任何情况下都适用。
决定适用异常之后,必须决定如何适用异常。
所谓异常处理,就是通知客户程序发生了非正常情况的机制。
以下几种非正常情况:
编译错误(compile error):语法错误。
逻辑错误(logical error):算法错误。只有cheng程序员才能检查这种错误。
运行时错误(runtime error):执行错误。一般为:数学运算发生溢出,磁盘空间不足或是文件损坏等在正常情况下不可能发生的错误。
异常就是JVM发给java程序的通知。java程序是JVM的客户。异常就是通知
条款1[规则】用时间频度来确定异常情况
当java程序违反了Java的语义规则时,Java虚拟机会将发生的错误表示为一个异常。
两种违反语义规则的情况:
一种是Java类库内置的语义检查。如:数组下标越界,会引发IndexOutOfBoundsException;访问null的对象,会引发NullPointerException.
另一种是:程序员自己定义的异常。
任何异常都会引起程序控制流的转移,当异常被抛出后,JVM会在抛出异常的方法中寻找最近匹配的Catch语句,如果没有,
则在调用方法中寻找,直至遍历调用栈中所以方法为止。如果没有找到任何匹配的catch语句,则会调用ThreadGroup.uncaughtException()方法。
所以的异常都是java.lang.Throwable的子类。更严谨一点说,我们应当尽量使它们仅仅是Error,Exception或者RuntimeException的子类。
finally关键字是对java异常处理模型的有益补充。finally块中的代码总会执行,而不管有无异常发生。 使用finally可以维护对象的内部状态,并且finally是释放非内存资源的最佳场所。
异常对性能的影响表现在两方面: 一是异常的创建,捕获和处理都需要较高的代价。这同JVM处理异常的方式有关 。
在java内存模型中,有一个称之为栈的内存区域,每一次方法调用,都会生成一帧来存储方法的相关信息,包括局部变量,参数,返回值和代码信息。