java.lang.Throwable
Java Throwable 从概念上区分为受检异常(Checked Exception)、非受检异常(Unchecked Exception)。
Java Throwable 从类上分为两个大类,Error 和 Exception(RuntimeException)。
- 受检异常:Exception
- 非受检异常:Error 和 RuntimeException
Subclass
Error
Error 类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。
常见如java.lang.StackOverFlowError
、Java.lang.OutOfMemoryError
遇到此类异常靠程序是无法处理和避免的。
Exception
- 受检异常(Checked Exception)
在编译期就会去检查的异常,表示这段代码可能会出现错误,需要try{}catch{}
去捕获异常,或通过throws
抛给上层调用方法,让上层方法处理。 - 运行时异常(Runtime Exception)
通常遇到这种异常,就代表程序有 BUG 了。该种异常编译器不会去检查,即使没有使用try{}catch{}
捕获,也没有使用throws
去抛出异常,都不会影响编译,运行时正常提示异常中断程序。
常见如:java.lang.NullPointerException
、java.lang.ClassNotFoundException
、java.lang.ArithmeticException
、java.lang.ArrayIndexOutOfBoundsException
Code
Throwable
Variable
private String detailMessage;
private Throwable cause = this;
Construction method
Throwable()
Throwable(String message)
,设置detailMessage
为message
,cause
Throwable(String message, Throwable cause)
,设置detailMessage
为message
,设置cause
为cause
Throwable(Throwable cause)
,设置detailMessage
为cause.toString()
,设置cause
为cause
Exception
当每个 Exception 都抛出一个带 Message 的对象时,只会输出最后一个 Exception 信息
1
2
3
4
5
6
7
8
9
10
11public 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
2Exception 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
12public 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
7cause: 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)