Java程序运行时出现的非正常现象,称为运行错误。可分为错误和异常。Java程序中,所有抛出的异常都必须从Throwable派生而来,类Throwable有两个直接子类: Error 和 Exception。
错误:最常见的错误有程序进入死循环、内存泄露等。这种情况下,程序运行时本身无法解决,只能通过其他程序干预。Java错误对应的类为Error类。Error类对象由Java虚拟机生成并抛弃。(通常Java程序不对这类异常进行处理)
异常:程序执行时遇到的非正常情况或意外行为。以下这些情况都一般都可以引发异常:代码或调用的代码中有错误、操作系统资源不可用、公共语言运行库遇到意外情况(如无法验证代码)等。常见的有数组下表越界、算法溢出、内存溢出、除数为0、无效参数等,程序运行时本身可以解决,由异常代码调整程序运行方向,使程序仍可继续运行,直至正常结束。
Java异常对应的类是Exception类,Java编译器要求程序必须捕获或声明所有的非运行时异常,但对运行时异常可以不做处理。
异常处理中,一般有两类异常:
其一,就是通过throw关键字,程序员在代码中人为抛出的异常(由于运行时动态地检测到了一个错误),这种异常叫做检查异常(Checked Exception),从java.lang.Exception类衍生出来;
其二,是系统运行时异常,例如“除数为0”、“空字符串”、“无效参数”等,这种异常叫做运行时异常(Runtime Exception),从java.lang.Runtime.Exception类衍生出来的。对于这类异常,javac是无法通过编译时的静态语法检测来判断到底哪些函数(或哪些区域的代码)可能抛出这类异常,这完全取决于运行时的状态,也正因为如此,Java异常处理模型中的"must be caught or declared to be thrown"规则也不适用于这类异常。但是Java虚拟机需要有效地捕获并处理此类异常。当然,我们也可以讲Runtime Exception显式的抛出。
Java中处理异常的关键字:try,catch,throw,throws,finally。
其中,try用来包住要监视的语句,catch用来捕获抛出的异常,finally用来处理善后的工作。catch可以有多个语句匹配多个不同的异常,finally先于try-catch语句块中的return语句执行。关于finally的深度剖析可以参考ibmDeveloper上面的一篇文章:http://www.ibm.com/developerworks/cn/java/j-lo-finally/
throw vs throws:
throw关键字用在方法体内部,用来抛出一个Throwable类型的异常对象。如果抛出了检查异常,则还应该在头部用throws关键字声明方法可能抛出的异常类型。
throws关键字用在方法体外部的方法声明部分,用来声明方法可能会抛出的异常。只有当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。