A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 聖手`书生 中级黑马   /  2013-4-7 20:52  /  1287 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 聖手`书生 于 2013-4-8 19:54 编辑

1.从代码的运行来看,我声明了两个异常,但是如果除0和角标越界的异常同时发生,程序只会运行ArrayIndexOutOfBoundsException类引用的catch块,而不会处理ArithmeticException类引用的catch块。试问一下,多异常的处理中,只能处理一个吗?
2.父类catch块只能放在所有catch块的最下面,如果放在前面,将会导致无论代码运算是否异常,都会使得编译失败,求解释。
  1. class Demo
  2. {
  3.         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  ExceptionDemo2
  11. {
  12.         public static void main(String[] args) //throws Exception
  13.         {
  14.                 Demo d = new Demo();
  15.                 try
  16.                 {
  17.                         int x = d.div(5,1);
  18.                         System.out.println("x="+x);
  19.                 }
  20.                
  21. /*
  22.                 catch(Exception e)
  23.                 {
  24.                         System.out.println("hahah:"+e.toString());
  25.                 }
  26. */
  27.                 catch (ArithmeticException e)
  28.                 {
  29.                         System.out.println(e.toString());
  30.                         System.out.println("被零除了!!");

  31.                 }
  32.                 catch (ArrayIndexOutOfBoundsException e)
  33.                 {
  34.                         System.out.println(e.toString());
  35.                         System.out.println("角标越界啦!!");
  36.                 }

  37.                 System.out.println("over");

  38.         }
  39. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

6 个回复

正序浏览
你这个问题。传递两个参数a,b。进入div方法后,进入出发内部的时候,是首先取数组中的元素作为除数,结果就越界了,还没等到除法完成呢。
Exception是所有其他Exception的父类,把他放在前面,就捕获了所有的异常,让后面的子Exception执行不了,所以编译器认为后面的代码是多余的。就报错了
回复 使用道具 举报
若还有问题,继续追问; 没有的话,请将帖子分类改成【已解决】哦~
回复 使用道具 举报
对于问题1
int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException

04.        {

05.

06.                int[] arr = new int[a];

07.

08.                System.out.println(arr[4]);

09.

10.                return a/b;

因为主函数是先执行的   System.out.println(arr[4]);
当角标越界发生的时候 下面的除法return a/b;运算不会执行,程序直接就找到角标越界对应的catch代码块进行处理,然后输出over就结束了.

你将除法运算 和角标越界两个代码 换下位置,那么就会跑出除零异常不抛出角标越界异常.

对于问题2

我也不太清楚具体的原因,我只能猜测,JVM已经捕捉到了两个子类异常,如果父类异常在其之前,异常怎么也不会叫子类catch处理,因为父类异常处理就干了.那么子类异常处理就成了垃圾代码了,所以编译不通过.
而父类异常处理放在下面,却不会成为垃圾代码,因为总有某些异常不是两个子类异常能够处理的,那么最下面的父类异常就有发挥之地,JVM不会判定父类异常处理代码块是垃圾代码,所以编译能通过.

点评

早睡早起身体好。。 缺乏睡眠会影响表达的。。  发表于 2013-4-8 10:24

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
关于多异常的处理而言,一般将范围最小的异常放在最上面。因为将父类放在上面的话,直接就捕获了异常,后面的语句无论如何也执行不到。这个和写语句到break,return等后面差不多。
而无论你的异常包括了多少种类,只要异常被捕获了,就会进入相应的catch块,而不会进入其他的。这也正是要将父类异常放到下面的原因。而角标越界和除零,无论发生哪一种,都无法继续运行了。所以捕获到两个中的哪一个都是差不多的,先后顺序也不会有太大的差别。一般而言不会发生两个都错的情况,这种情况仅仅是老师的案例,不用过于纠结没有捕获到另外一个,因为根本就不可能捕获到两个。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
第一个问题:
06.                int[] arr = new int[a];
07.
08.                System.out.println(arr[4]);//当这里越界时,就 new ArrayIndexOutOfBoundsException()对象,抛给main函数,然后被catch (ArrayIndexOutOfBoundsException e)接收被处理。
10.                return a/b;//上面那句话已经异常了,这句话就不会执行了。
第二个问题:
如果父类Exception()在最上面,那么下面的两个字类就没有意义了,因为不管出现两个中的哪一个都被父类的Exception()所接收
其实,也没有必要在第三个位置定义父类接收其他位置异常,因为就算真的出现了该未知异常,最合理的解决方法是让程序停止,然后由程序员自行编写代码解决该问题。

这个是我的理解,仅供参考。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
第一个问题多异常的处理中,只能处理一个吗?
是的  捕获到一个异常之后 后面的代码就没有执行的必要了 因为你的程序都出问题了 执行下去当然没意思 不过这是针对像你这样的  异常出在一个代码块中 比如在两个函数中或者类中  就不会
第二个问题 打个比方 父类Exception 下面的子类角标越界异常 你把父类的异常捕捉块放在前面 当出现角标越界异常的时候 就先会被父类的catch块捕捉到  代码就不会再向下执行 但是父类的异常又处理不了角标异常这种细节问题 所以 异常当然不能被正确处理了  放在最后的道理也很简单 当所有的catch都没捕捉到  则最后肯定会被Exception的catch块捕捉到

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马