黑马程序员技术交流社区

标题: catch异常问题 [打印本页]

作者: 高鑫    时间: 2012-5-9 02:43
标题: catch异常问题
  1. class Demo
  2. {
  3.         public int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException  //声明可能会出现问题
  4.         {
  5.                 int [] arr=new int[a];
  6.                 System.out.println(arr[4]);
  7.                 return a/b;
  8.         }
  9. }
  10. class ExceptionDemo
  11. {
  12.         public static void main(String[] args)
  13.         {
  14.                 Demo d = new Demo();
  15.                 try
  16.                 {
  17.                         int x=d.div(4,0);
  18.                         System.out.println("x="+x);
  19.                 }
  20.        
  21.                 catch (Exception e)
  22.                 {
  23.                         System.out.println("haha:"+e.toString());
  24.                 }
  25.                 catch(ArithmeticException e)
  26.                 {
  27.                         System.out.println(e.toString());
  28.                         System.out.println("快零除了");
  29.                 }
  30.                 catch(ArrayIndexOutOfBoundsException e)
  31.                 {
  32.                         System.out.println(e.toString());
  33.                         System.out.println("角标越界了");
  34.                 }       
  35.                
  36.                 System.out.println("over");
  37.         }
  38. }

复制代码
我看视频中有点没弄明白,把父类异常catch (Exception e)放在最上面的话,为什么编译都通不过?我认为应该是父类异常执行后,下面的2个子类catch就不执行了。为什么通不过呢,是不是我理解错了
作者: 龚振 龚振 龚振    时间: 2012-5-9 03:12
本帖最后由 龚振 龚振 龚振 于 2012-5-9 03:14 编辑

自己的一些理解,供参考噢~
1捕捉异常要尽量具体,尽量详细。如果把父类异常catch (Exception e)放最上面,
             那所有异常都被Exception捕捉了,下面的子类无法捕捉,没意义了,不具体,编译也不通过。
2将子类异常放上面,最后加上父类异常catch (Exception e),
             还可以对可能存在但又未捕获到的异常通过父类异常catch (Exception e)进行查漏捕获
作者: 黄秋    时间: 2012-5-9 03:29
理由楼上也说了。这是由 java 的规则所定的,如同 return 后面不能有其它语句,catch (Exception e)放在最上面,那它后面的语句就无意义了,因不会被执行到。
作者: 杨威    时间: 2012-5-9 11:34
编译不通过就是说明存在语法错误,你把Exception放在上面,它什么异常都能解决,这样下面两个catch等于无用,执行不到啊。就相当于多余的,编译自然失败了……
作者: HeiMaYSL    时间: 2012-5-9 12:18
我的理解是:
    既然在Demo类里声明了异常,
那么,在main方法里,捕获异常时,要么把子类异常写在上面。这样可以看清楚比较具体的异常。
    如果,把父类异常放在了前面,那么,子类的异常就没有必要再写在下面了。因为,父类已经处理了,你就没有必要再让子类异常再去处理了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2