java.lang.Throwable

Java Throwable 从概念上区分为受检异常(Checked Exception)、非受检异常(Unchecked Exception)。

Java Throwable 从类上分为两个大类,Error 和 Exception(RuntimeException)。

  • 受检异常:Exception
  • 非受检异常:Error 和 RuntimeException

Subclass

Error

Error 类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。
常见如java.lang.StackOverFlowErrorJava.lang.OutOfMemoryError

遇到此类异常靠程序是无法处理和避免的。

Exception

  • 受检异常(Checked Exception)
    在编译期就会去检查的异常,表示这段代码可能会出现错误,需要try{}catch{}去捕获异常,或通过throws抛给上层调用方法,让上层方法处理。
  • 运行时异常(Runtime Exception)
    通常遇到这种异常,就代表程序有 BUG 了。该种异常编译器不会去检查,即使没有使用try{}catch{}捕获,也没有使用throws去抛出异常,都不会影响编译,运行时正常提示异常中断程序。
    常见如:java.lang.NullPointerExceptionjava.lang.ClassNotFoundExceptionjava.lang.ArithmeticExceptionjava.lang.ArrayIndexOutOfBoundsException

Code

Throwable

Variable

private String detailMessage;
private Throwable cause = this;

Construction method

  • Throwable()
  • Throwable(String message),设置detailMessagemessagecause
  • Throwable(String message, Throwable cause),设置detailMessagemessage,设置causecause
  • Throwable(Throwable cause),设置detailMessagecause.toString(),设置causecause

Exception

  • 当每个 Exception 都抛出一个带 Message 的对象时,只会输出最后一个 Exception 信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void main(String[] args) {
    try {
    try {
    throw new Exception("Test Exception 1");
    } catch (Exception e) {
    throw new Exception("Test Exception 2");
    }
    } catch (Exception e) {
    throw new RuntimeException("Test Exception 3");
    }
    }

    控制台输出:

    1
    2
    Exception in thread "main" java.lang.RuntimeException: Test Exception 3
    at test.classs.exception.ExceptionTest1.main(ExceptionTest1.java:13)
  • 当多重嵌套时,会将每一个的 Exception 信息都打印出来

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static void main(String[] args) {
    try {
    try {
    throw new Exception("Test Exception 1");
    } catch (Exception e) {
    throw new Exception(e);
    }
    } catch (Exception e) {
    System.out.println("cause: " + e.getCause());
    throw new RuntimeException(e);
    }
    }

    控制台输出:

    1
    2
    3
    4
    5
    6
    7
    cause: java.lang.Exception: Test Exception 1
    Exception in thread "main" java.lang.RuntimeException: java.lang.Exception: java.lang.Exception: Test Exception 1
    at test.classs.exception.ExceptionTest1.main(ExceptionTest1.java:14)
    Caused by: java.lang.Exception: java.lang.Exception: Test Exception 1
    at test.classs.exception.ExceptionTest1.main(ExceptionTest1.java:10)
    Caused by: java.lang.Exception: Test Exception 1
    at test.classs.exception.ExceptionTest1.main(ExceptionTest1.java:8)