异常(Exception):发生在程序执行期间,表明出现了一个非法的运行状况,会抛出一个异常对象。
JDK中与异常相关的类:
Throwable:所有错误处理的父类,两种子类,Error和Exception。
Error:由JVM所侦测到的无法预期的错误,JVM层次的错误,导致JVM无法运行。无法被捕捉。
Exception:可以捕捉到的异常,主要包括两类,runtime exception和checked exception。
checked exception:可以被修复,常见的有IO异常等,要求强制捕获或抛出。当前如果能够处理异常,应该使用try…catch…finally捕获,在对应的catch语句块中进行异常处理。如果不能处理,应该在可能产生异常的方法定义出抛出异常,由调用者处理。调用者也应该处于try…catch语句块中,或者调用者的方法也需要throw抛出递归这个过程,直到能够处理。
runtime exception:运行时异常,可以不用处理。系统会把该异常往上层抛出,知道遇到处理代码。如果没有被处理,到最上层处。如果是多线层由Thread.run()抛出,如果是单线程就被main()抛出,单线程退出,如果是主程序抛出,程序退出并进行错误信息打印提示。常见的如NullPointerException,ArrayIndexOutOfBoundsException等,这类异常通常是编写的程序有bug,即语义错误。
异常处理链
实际开发中,需要将“过于专业”的异常转换为一个“业务异常”。自定义一些业务逻辑异常,将JVM抛出的异常捕获,转化为中间层的业务逻辑异常,再转化为上层交互界面能够理解的报错信息。
异常尽量在到达界面层前被解决,能够被解决的异常不要向上抛出。
对于多种异常,要分别catch,具体处理,避免问题被掩盖。
参考:
《Java程序设计》/《面向对象编程基础》:第9讲《异常处理》
运行时异常(RuntimeException)与一般异常有何不同?