黑马程序员技术交流社区
标题:
异常问题求解
[打印本页]
作者:
聖手`书生
时间:
2013-4-7 20:52
标题:
异常问题求解
本帖最后由 聖手`书生 于 2013-4-8 19:54 编辑
1.从代码的运行来看,我声明了两个异常,但是如果除0和角标越界的异常同时发生,程序只会运行ArrayIndexOutOfBoundsException类引用的catch块,而不会处理ArithmeticException类引用的catch块。试问一下,多异常的处理中,只能处理一个吗?
2.父类catch块只能放在所有catch块的最下面,如果放在前面,将会导致无论代码运算是否异常,都会使得编译失败,求解释。
class Demo
{
int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException
{
int[] arr = new int[a];
System.out.println(arr[4]);
return a/b;
}
}
class ExceptionDemo2
{
public static void main(String[] args) //throws Exception
{
Demo d = new Demo();
try
{
int x = d.div(5,1);
System.out.println("x="+x);
}
/*
catch(Exception e)
{
System.out.println("hahah:"+e.toString());
}
*/
catch (ArithmeticException e)
{
System.out.println(e.toString());
System.out.println("被零除了!!");
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println(e.toString());
System.out.println("角标越界啦!!");
}
System.out.println("over");
}
}
复制代码
作者:
张先龙
时间:
2013-4-7 21:12
第一个问题多异常的处理中,只能处理一个吗?
是的 捕获到一个异常之后 后面的代码就没有执行的必要了 因为你的程序都出问题了 执行下去当然没意思 不过这是针对像你这样的 异常出在一个代码块中 比如在两个函数中或者类中 就不会
第二个问题 打个比方 父类Exception 下面的子类角标越界异常 你把父类的异常捕捉块放在前面 当出现角标越界异常的时候 就先会被父类的catch块捕捉到 代码就不会再向下执行 但是父类的异常又处理不了角标异常这种细节问题 所以 异常当然不能被正确处理了 放在最后的道理也很简单 当所有的catch都没捕捉到 则最后肯定会被Exception的catch块捕捉到
作者:
刘海东
时间:
2013-4-7 22:05
第一个问题:
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()所接收
其实,也没有必要在第三个位置定义父类接收其他位置异常,因为就算真的出现了该未知异常,最合理的解决方法是让程序停止,然后由程序员自行编写代码解决该问题。
这个是我的理解,仅供参考。
作者:
王梦南
时间:
2013-4-7 23:06
关于多异常的处理而言,一般将范围最小的异常放在最上面。因为将父类放在上面的话,直接就捕获了异常,后面的语句无论如何也执行不到。这个和写语句到break,return等后面差不多。
而无论你的异常包括了多少种类,只要异常被捕获了,就会进入相应的catch块,而不会进入其他的。这也正是要将父类异常放到下面的原因。而角标越界和除零,无论发生哪一种,都无法继续运行了。所以捕获到两个中的哪一个都是差不多的,先后顺序也不会有太大的差别。一般而言不会发生两个都错的情况,这种情况仅仅是老师的案例,不用过于纠结没有捕获到另外一个,因为根本就不可能捕获到两个。
作者:
曹宇
时间:
2013-4-8 03:00
对于问题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:25
若还有问题,继续追问; 没有的话,请将帖子分类改成【已解决】哦~
作者:
王川
时间:
2013-4-8 12:03
你这个问题。传递两个参数a,b。进入div方法后,进入出发内部的时候,是首先取数组中的元素作为除数,结果就越界了,还没等到除法完成呢。
Exception是所有其他Exception的父类,把他放在前面,就捕获了所有的异常,让后面的子Exception执行不了,所以编译器认为后面的代码是多余的。就报错了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2