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 }