一、概念:在程序流中exception可以描述一些异常的情况并阻止程序进行更深入的执行。
二、关系:
Error类和Exception类都继承自Throwable类。
Exception:
1.可以是可被控制(checked) 或不可控制的(unchecked)。
2.表示一个由程序员导致的错误。
3.应该在应用程序级被处理。
Error:
1.总是不可控制的(unchecked)。
2.经常用来用于表示系统错误或低层资源的错误。
3.如何可能的话,应该在系统级被捕捉。
Exception 分为:
1)Checked exception: 这类异常都是Exception的子类 。异常的向上抛出机制进行处理,假如子类可能产生A异常,那么在父类中也必须throws A异常。可能导致的问题:代码效率低,耦合度过高。
2) Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们不能通过client code来试图解决,所以称为Unchecked exception 。
和Unchecked Exceptions比较,checked exceptions必须被调用者所捕获,或者被列为方法签名的一部分(使用throws关键字)
三、常见的exception
| Java 的非检查性异常 | 描述 |
|---|---|
| NullPointerException空指针 | 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 |
| IllegalArgumentException非法参数 | 抛出的异常表明向方法传递了一个不合法或不正确的参数。 |
| IllegalStateException | 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 |
| IndexOutOfBoundsException下标越界 | 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 |
| UnsupportedOperationException不支持操作 | 当不支持请求的操作时,抛出该异常。 |
| ArrayIndexOutOfBoundsException | 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。 |
| ClassCastException强制转换 | 当试图将对象强制转换为不是实例的子类时,抛出该异常。 |
| EnumConstantNotPresentException | 枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象并不包含常量时,抛出该异常。 |
| NumberFormatException数字格式 | 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 |
| StringIndexOutOfBoundsException | 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 |
| IOException | 输入输出异常 |
| ArithmeticException | 算术运算 |
| NegativeArraySizeException | 创建一个大小为负数的数组错误异常 |
| SecurityException | 安全异常 |
| ArrayStoreException - | 向数组中存放与声明类型不兼容对象异常 |
| NoSuchMethodException | 方法未找到异常: |
| SQLException | 操作数据库异常: |
| FileNotFoundException | 文件未找到异常: |
四、自定义异常类:
- 写一个检查性异常类,需要继承 Exception 类。
- 写一个运行时异常类,需要继承 RuntimeException 类。
class 类名 extends 异常名 {
public 异常名 {
super();
}
public 异常名( message参数 ) {
super( message );
}
public 异常名(message参数, Throwable cause 参数) {
super( message, cause );
}
}
异常想要被抛出和捕获,需要同时使用throw、throws、try、catch以及finally等函数。
五、小结
采用exception提高了我们debug的效率。 异常在Java中是错误管理的基础。和错误码、错误标记及状态相比,异常(Exceptions)让错误条件的处理和提示变得非常的容易,异常不能忽略。



