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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Tesla时光 中级黑马   /  2012-9-6 11:07  /  1732 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 翁发达 于 2012-9-7 09:45 编辑

如下,在异常中,我们如果先catch父类的异常,再catch子类异常.这是不可以的,但先catch子类异常再catch父类异常就没问题,
谁可以和我讲讲具本原因是什么?
一个异常,父类,子类都可catch,本来按理讲,要么就只能放一个,要么就两个都能放,可里这种方式的原理是什么一直想不明白.
class Num
{
public static void main(String[] args)
{
  Num1 n = new Num1();
  try
  {
   n.num(2,0);
  }
  catch (RuntimeException e)
  {
   System.out.println(e.getMessage()+"\n"+"ffffffffffffff");
  }
  
  catch (NumException e)
  {
   System.out.println(e.getMessage()+"\n");
  }
}
}
class Num1
{
int num(int a,int b) throws NumException
{
  if(b<1)
  {
   throw new NumException("不可以为零",b);
  }
  return a/b;
}
}
class NumException extends RuntimeException
{
int b;
NumException(String message, int b)
{
  super(message);
  this.b=b;
}
int getNum()
{
   return b;
}
}

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
首先所有异常都是Exception的子类。
try后面可以跟多个catch,并且多个catch的异常可以有父子关系,但是要先catch子类异常,再catch父类异常。

举例来说,SocketException套接字异常是IOException输入输出异常的子类,也就是说SocketException是具体的一种IOException,当然还有其它种类的IOException。
所以要先catch(SocketException e),再catch(IOException e),这样的意思就是如果是SocketException异常就会在前面的catch被抓到,否则其它的IOException就会在后面被抓到。这样你就可以理解为什么要把子类放前面catch了
回复 使用道具 举报
和异常处理的顺序有关,父类异常是所有异常的父类,父类异常写在前面的话,所有的异常都会捕获掉!程序将出现的异常进行匹配,匹配父类的工作量太大,不能节省资源!在同一代码块中异常只能被捕获异常一次,一旦捕获就会对相应的异常进行处理,所以后面的异常的子类就无法捕获,更无法处理!
回复 使用道具 举报
如果先catch父类,比如catch(Exception e),所有的异常有在Exception里面,也就是Exception都可以捕获到,这样的话,在catch子类,即使有子类能捕获的异常,它也被父类先捕获了,那就没有catch子类什么事了。先catch父类,后面catch它的子类就已经没有意义了。

一个异常,如你定义的NumException异常,  catch(NumException e)就只能捕捉到它定义的异常NumException,如果还有别的异常产生,不在它的范围内的异常,它就捕捉不到了,所以后面在加它的父类或者比他范围更大的类,这样即使有前面捕捉不到的异常,后面也能捕捉到。
这样有一个劣势,如果产生了比NumException以外的异常,被后面定义的catch父类捕捉。那么当程序执行完,你也不知道它产生的具体异常是什么,只知道产生过一个异常。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马