日期:2018.11.8
星期四
博客期:022
-----------------------------------------------------------------------------------------
Part 1: 基本异常处理
1 package teacher; 2 3 import javax.swing.*; 4 5 class AboutException { 6 public static void main(String[] a) 7 { 8 int i=1, j=0, k; 9 k=i/j; 10 11 12 try 13 { 14 15 k = i/j; // Causes division-by-zero exception 16 throw new Exception("Hello.Exception!"); 17 } 18 19 catch ( ArithmeticException e) 20 { 21 System.out.println("被0除. "+ e.getMessage()); 22 } 23 24 catch (Exception e) 25 { 26 if (e instanceof ArithmeticException) 27 System.out.println("被0除"); 28 else 29 { 30 System.out.println(e.getMessage()); 31 32 } 33 } 34 35 36 finally 37 { 38 JOptionPane.showConfirmDialog(null,"OK"); 39 } 40 41 } 42 }
AboutException.java
运行结果如下:
说明:因为当你的程序出现错误的时候,即第一个 k = i / j ;语句执行的时候,你的程序运行到这里就结束(中断)了,不可能继续运行try{}里的 k = i / j ;语句,所以会是这个结果!而当你将它的第一个 k = i / j; 用//或/**/注释掉之后 ,运行结果如下:
在你注释掉了以后,它会继续执行try{}里的 k = i / j ;语句,也就会在try{}里抛出 ArithmeticException ,而后边刚好有catch 语句接到了,进而做了内部处理,由于 ArithmeticException 已经得到了 catch,后面的 catch (Exception e) 就没有接到,于是不执行,而后面的finally除了特殊情况,一般是要执行的,于是便是这样的结果!但如果你把第二个 k = i / j; 也用//或/**/注释掉之后,运行结果如下:
理由很清晰,就是根据类型执行catch 语句和 finally 语句!
-----------------------------------------------------------------------------------------
Part 2: 多层的异常捕获(1+2)
1 package teacher; 2 3 public class CatchWho { 4 public static void main(String[] args) { 5 try { 6 try { 7 throw new ArrayIndexOutOfBoundsException(); 8 } 9 catch(ArrayIndexOutOfBoundsException e) { 10 System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch"); 11 } 12 13 throw new ArithmeticException(); 14 } 15 catch(ArithmeticException e) { 16 System.out.println("发生ArithmeticException"); 17 } 18 catch(ArrayIndexOutOfBoundsException e) { 19 System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch"); 20 } 21 } 22 }
CatchWho.java
1 package teacher; 2 3 public class CatchWho2 { 4 public static void main(String[] args) { 5 try { 6 try { 7 throw new ArrayIndexOutOfBoundsException(); 8 } 9 catch(ArithmeticException e) { 10 System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch"); 11 } 12 throw new ArithmeticException(); 13 } 14 catch(ArithmeticException e) { 15 System.out.println("发生ArithmeticException"); 16 } 17 catch(ArrayIndexOutOfBoundsException e) { 18 System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch"); 19 } 20 } 21 }
CatchWho2.java
这两段代码的运行截图分别如下:
说明:那我就把这两个案例综合在一起分析吧!首先对比这两个案例!我们可以看到区别,内部try{}里的所要catch的异常不同——ArrayIndexOutOfBoundsException和ArithmeticException,但究竟是什么原因导致了这结果的不同呢?我来说吧!这无外乎就是这一个catch的嵌套比较特殊!因为它两层的嵌套有重复的Exception监听处理,这就产生了另外一个问题——究竟是哪个或哪些部分catch到了异常呢?我们从运行结果中可以得知,catch是就近原则的,而且除了
原文地址:https://www.cnblogs.com/onepersonwholive/p/9930040.html