Java_异常源码分析

470 阅读1分钟

1. Throwable成员方法

www.bilibili.com/video/BV18J…

2. Throwable的成员方法

方法名说明
public String getMessage()返回throwable的详细消息字符串
public String toString()返回此可抛出的简短描述
public void printStackTrace()把异常错误信息输出到控制台

3. 🚀案例1: 演示getMessage()方法

try{
    int[] arr = {1,2,3};
    System.out.println(arr[3]);
}catch (ArrayIndexOutOfBoundsException e){
    System.out.println(e.getMessage()); //Index 3 out of bounds for length 3
}

控制台输出:

开始
Index 3 out of bounds for length 3
结束

⚠️不同版本的JDK输出的异常报错信息内容不同,如使用JDK1.8只会输出3,而使用较为高的版本,如JKD15则会输出较为完整的信息Index 3 out of bounds for length 3

4. Throwable源码分析

// 异常类继承结构树形图
Throwable
    |  extends
Exception
    |  extends
RuntimeException
    |  extends
IndexOutOfBoundsException
    |  extends
ArrayIndexOutOfBoundsException
// ArrayIndexOutOfBoundsException.java
// Constructs a new ArrayIndexOutOfBoundsException class with an argument indicating the illegal index.
public ArrayIndexOutOfBoundsException(int index) {
    super("Array index out of range: " + index);
}

ArrayIndexOutOfBoundsException.java这个类中有一个构造方法,会去调用父类(IndexOutOfBoundsException)的构造方法,依次到Throwable(继承)。

// Throwable.java

private String detailMessage;

// ...

public Throwable(String message) {
    fillInStackTrace();
    detailMessage = message;
}
// ...
public String getMessage() {
    return detailMessage;
}
// ...

分析: 实际上new ArrayIndexOutBoundsException()这个对象时,是传递了参数(越界的索引)的,然后在自己的构造方法中调用「直接父类构造器」并传参,最终调用到超类Throwable,并且在超类中赋值给超类自己的私有成员detailMessage

所以getMessage()所输出的信息是来源于Throwable中的赋值。这个getMessage()也是超类Throwable中的方法(逐级继承)