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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 聖手`书生 中级黑马   /  2013-4-7 20:52  /  1293 人查看  /  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 个回复

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

查看全部评分

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

评分

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

查看全部评分

回复 使用道具 举报
对于问题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

查看全部评分

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