1 public class Demo13{
2
3
4 /*Java规定:
5 1.必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,这种类型的异常称为Checked Exception。
6
7 2.不需要捕获的异常,包括Error及其子类,RuntimeException及其子类。
8 */
9 public static void main(String[] args) {
10 try{
11 process1();
12 }catch(Exception e){
13 //main()中捕获IllegalArgumentException,我们看看打印的异常栈
14 e.printStackTrace();
15 //注意到Caused by: Xxx,说明捕获的IllegalArgumentException并不是造成问题的根源,根源在于NullPointerException,是在Main.process2()方法抛出的。
16 }
17
18 }
19
20 //当process2()抛出NullPointerException后,被process1()捕获,然后抛出IllegalArgumentException()
21
22 static void process1(){
23 try{
24 process2();
25 }catch(NullPointerException e){
26 //如果一个方法捕获了某个异常后,又在catch子句中抛出新的异常,就相当于把抛出的异常类型“转换”了:
27 //为了能追踪到完整的异常栈,在构造异常的时候,把原始的NullPointerException实例传进去,新的IllegalArgumentException就可以持有原始NullPointerException信息
//捕获到异常并再次抛出时,一定要留住原始异常,否则很难定位第一案发现场!
28 throw new IllegalArgumentException(e);
29 }
30 }
31
32
33 static void process2(){
34 throw new NullPointerException();
35 }
36
37 }
![]()