Java 异常
异常:
定义:程序执行中发生的不正常情况,如果出现异常,程序未处理,程序就会崩溃
java异常架构图

1. Throwable Throwable是 Java 语言中所有错误或异常的超类。 Throwable包含两个子类: Error 和 Exception。它们通常用于指示发生了异常情况。 Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息。
1. 返回异常发生时的详细信息
public string getMessage();
2. 返回异常发生时的简要描述
public string toString();
3. 返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同
public string getLocalizedMessage();
4. 在控制台上打印Throwable对象封装的异常信息
public void printStackTrace();
2. Exception Exception及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
3. RuntimeException RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 编译器不会检查RuntimeException异常。例如,除数为零时,抛出ArithmeticException异常。RuntimeException是ArithmeticException的超类。当代码发生除数为零的情况时,倘若既"没有通过throws声明抛出ArithmeticException异常",也"没有通过try...catch...处理该异常",也能通过编译。这就是我们所说的"编译器不会检查RuntimeException异常"! 如果代码会产生RuntimeException异常,则需要通过修改代码进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!
4. Error 和Exception一样,Error也是Throwable的子类。它用于指示合理的应用程序不应该试图捕获的严重问题,大多数这样的错误都是异常条件。 和RuntimeException一样,编译器也不会检查Error。
异常分类:
按严重程度:
error:java虚拟机无法解决的严重问题 例:JVM系统内部错误、资源耗尽等严重情况
Exception:编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进 行处理。 例:空指针访问
按照类型:
受检异常: 程序中必须接受检查和处理的异常,由Exception 类(RuntimeException类及子类除外)表示。 非受检异常: 程序中可以不接受检查和处理,或致命性错误异常,由RuntimeException类及子类和Error类及子类表示。


常见异常
1. RuntimeException子类:
| 序号 | 异常名称 | 异常描述 |
|---|---|---|
| 1 | java.lang.ArrayIndexOutOfBoundsException | 数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。 |
| 2 | java.lang.ArithmeticException | 算术条件异常。譬如:整数除零等。 |
| 3 | java.lang.SecurityException | 安全性异常 |
| 4 | java.lang.IllegalArgumentException | 非法参数异常 |
| 5 | java.lang.ArrayStoreException | 数组中包含不兼容的值抛出的异常 |
| 6 | java.lang.NegativeArraySizeException | 数组长度为负异常 |
| 7 | java.lang.NullPointerException | 空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。 |
2.IOException
| 序号 | 异常名称 | 异常描述 |
|---|---|---|
| 1 | IOException | 操作输入流和输出流时可能出现的异常 |
| 2 | EOFException | 文件已结束异常 |
| 3 | FileNotFoundException | 文件未找到异常 |
3. 其他
| 序号 | 异常名称 | 异常描述 |
|---|---|---|
| 1 | ClassCastException | 类型转换异常类 |
| 2 | ArrayStoreException | 数组中包含不兼容的值抛出的异常 |
| 3 | SQLException | 操作数据库异常类 |
| 4 | NoSuchFieldException | 字段未找到异常 |
| 5 | NoSuchMethodException | 方法未找到抛出的异常 |
| 6 | NumberFormatException | 字符串转换为数字抛出的异常 |
| 7 | StringIndexOutOfBoundsException | 字符串索引超出范围抛出的异常 |
| 8 | IllegalAccessException | 不允许访问某类异常 |
| 9 | InstantiationException | 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常 |
| 10 | java.lang.ClassNotFoundException | 找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。 |
对于异常的处理三种方式:
1.捕获(使用try-catch-finally语句)
try{
可能抛出异常的语句;
}catch((范围小)可能的异常类型1 引用){
处理异常,引用.方法...
}catch((范围大)可能的异常类型2 引用){
处理异常,引用.方法...
}finally{
一定会执行的代码ps:即使提前return; finally依然执行
}
2.直接抛出(方法声明)在具体位置不处理
//throw 抛出异常时方法直接弹出栈,类似return
//throws 可能抛出的异常类型列表
//throws 用于警告此方法的调用者,可能会出现的风险
public class className{
public void deposit(double amount) throws RemoteException{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
3.捕获再抛出 :统一处理异常
会先捕获异常,然后将该异常包装为自定义异常,再抛出给调用者。
try{
result = x/y;
} catch (ArithmeticException e) {
throw new DividedByZeroException(e);
}
自定义异常:
1.继承Exception
2.在子类中必须提供多个构造器
好处:1.对异常进行统一的处理
浙公网安备 33010602011771号