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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 葛奎 中级黑马   /  2012-6-4 18:20  /  2181 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当多个catch块中异常出现继承关系时,为什么父类异常的catch块一定要放在最下面呢?否则就会编译失败.

例:
class Exc0 extends Exception{}
class Exc1 extends Exc0{}

class Demo
{
    public static void main(String[] args)
    {
        try
        {
            throw new Exc1();
        }        
        catch(Exception e)        
        {
            System.out.println("Exception");
        }
        catch(Exc0 e)
        {
            System.out.println("Exc0");
        }
    }
}
//会编译失败,把catch(Exception e)放在下面就通过了  这是为什么呢

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 鼓励一下!!可以重复看下视频.

查看全部评分

7 个回复

倒序浏览
在多个catch语句块中:判断捕获的信息如果具有继承关系,那么就把子类方法放在父类的前面。如果没有继承关系就可以不按照顺序来
    在try语句块后面可以不要catch语句块,也可以不要finally,但是try后面必须要有catch或finally.这三个块都不能独立使用.
    finally
      finally中的代码表示,在try块中的代码有异常与否,它都会执行
      无论try和catch块中有return与否,在程序最后finally都会执行
      如果想让finally语句块不执行,只有在finally语句块之前使用System.exit(0)语句
    try将可能会出错的代码放入块中


如果异常类型之间有继承关系,子类一定要在前面,这是个规则

回复 使用道具 举报
打个比方吧,就好像去打架,你派的第一个兄弟出去就能够把对方所有的人解决掉,你还需要其他兄弟干嘛呢?父类Exception放在上面能把下面要解决的问题都包含在内,所以子类异常放在下面就没意义了,因而如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 支持原创~~~很形象

查看全部评分

回复 使用道具 举报
田建 发表于 2012-6-4 18:31
打个比方吧,就好像去打架,你派的第一个兄弟出去就能够把对方所有的人解决掉,你还需要其他兄弟干嘛呢?父 ...

正解、正解。
回复 使用道具 举报
我的小总结:

1,声明异常时,建议声明更为具体的异常。这样处理的可以更具体
2,对方声明几个异常,就对应有几个catch块,不要定义多余的catch块
   如果多个catch块中的异常出现异常继承关系,父类异常catch块放在最下边
3,建议在进行catch块处理时,catch中一定要定义具体处理方式。
   不要简单的定义一句 e.printStackTrace(),
    也不要简单的就书写一条输出语句
4,如你所说如果把父类放在最前面的话,那么他也有处理其子类异常的能力,这样子类自己处理自己异常的就有点多余了,没有针对性,也不具体。所以
  把父类放在最后面让子类自己处理自己的异常。

希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
这是异常声明的规则,如果父类在上面已经能接受所有异常了,那么在下面的子类声明就完全无意义了,这就会出现编译报错,无效代码。
回复 使用道具 举报
简单的说父异常在上面 会直接被catch  子异常想执行的代码就不会执行 所以报错....
回复 使用道具 举报
恩恩 多谢各位  基本上懂了{:soso_e198:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马