Java中的异常处理

一、概述

Java异常是Java提供的一种识别和响应错误的一致性机制。

Java异常机制可以使得异常处理代码和正常业务逻辑代码分离,使程序更加优雅,提高代码的健壮性。一般情况下,Java异常应用可以回答三个问题:what、where、why。what:发生了什么错误?where:哪里发生的?why:为什么会发生?分别由异常中异常类型、异常堆栈、异常信息回答。

二、框架

exception01-01.jpg

Throwable

Throwable是Java语言中所有错误或异常的超类。

Throwable包含两个子类:Error和Exception。Error表示“错误”,Exception表示“异常”

Throwable中包含异常堆栈和异常信息。可以使用printStackTrace()getMessage()获取。

Error

Throwable子类,用于指示应用程序不该捕获且无法解决的严重问题。

编译器并不会检查Error。

Exception

Throwable子类,用于指示应用程序发生的异常。

RuntimeException

Exception子类,用于指示Java 虚拟机正常运行期间抛出的异常。

编译器不会检查RuntimeException。

如果产生了RuntimeException,需要修改代码来进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生。

三、异常分类

java中异常可以分为三类:被检查的异常(Checked Exception)、运行时异常(Runtime Exception)和错误(Error)。

1.被检查异常

范围:Exception类及其子类(不包含RuntimeException及其子类)

特点:编译器会检查它。此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。

处理:抛出或者捕获异常,并尝试恢复。

常见:

异常 说明
CloneNotSupportedException 通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口

2. 运行时异常

范围:RuntimeException及其子类

特点:编译器不会检查运行时异常。即“没有通过throws声明抛出它”或者“没有在try-catch中捕获它”,都是可以通过编译的。

处理:当产生运行时异常时,需要检查代码,完善代码逻辑来避免。

常见:

异常 说明
ArithmeticException 除数为0
IndexOutOfBoundsException 数组越界
ConcurrentModificationException 并发修改

3.错误

范围:Error及其子类。

特点:编译器不会检查它。

处理:程序本身无法修复这些错误的。

常见:

异常 说明
VirtualMachineError 虚拟机错误

4.使用

对于可以恢复的条件使用被检查异常,对于程序错误使用运行时异常。

四、使用建议

1. 合理使用被检查异常

使用被检查的异常必须同时满足两个条件:

  1. 正确调用API并不能阻止异常的发生。
  2. 一旦发生了异常,调用者可以采取有用的动作对程序进行处理

2. 合理包装低层异常

尽量避免一个方法抛出一个与它执行的任务没有明显的关联关系的异常。常见于方法传递由低层抽象抛出的异常,这种情况发生时,不仅让人困惑,而且也"污染"了高层API。

为了避免这个问题,高层实现应该捕获低层的异常,同时抛出一个可以按照高层抽象进行介绍的异常。这种做法被称为"异常转译(exception translation)"。

例如,在Java的集合框架AbstractSequentialList的get()方法如下:

public E get(int index) {
    try {
        return listIterator(index).next();
    } catch (NoSuchElementException exc) {
        throw new IndexOutOfBoundsException("Index: "+index);
    }
}

你可能感兴趣的:(Java中的异常处理)