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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴振良 黑马帝   /  2012-2-8 21:57  /  1861 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴振良 于 2012-2-10 20:48 编辑

在张孝祥老师的java基础4-2的视频中有:
1、一个方法被覆盖时,覆盖它的方法必须扔出相同的异常或异常的子类。
   
2、如果父类扔出多个异常,那么重写(覆盖)方法必须扔出那些异常的一个子集,也就是说不能扔出新的异常。

这两点没有举实例,我理解不了,
上面1中的“覆盖它的方法必须扔出异常的子类”这一句不太理解,大家给举些例子呀?
上面2中的扔出一个子集是怎样的?什么叫子集呀,大家给举些例子呀!

评分

参与人数 5技术分 +1 黑马币 +80 收起 理由
dzl + 20
哈哈哈 + 20
张妙 + 20 赞一个!
黄文刚 + 20 好好学习
admin + 1

查看全部评分

12 个回复

倒序浏览
JAVA中用2种方法处理异常:

1.在发生异常的地方直接处理;

2.将异常抛给调用者,让调用者处理。

JAVA异常可分为3种:
(1)检查性异常:java.lang.Exception
(2)运行期异常:java.lang.RuntimeException
(3)错误:java.lang.Error

顶层是java.lang.Throwable类,检查性异常,运行期异常,错误都是这个类的子孙类。

java.lang.Exception和java.lang.Error继承自java.lang.Throwable,而java.lang.RuntimeException继承自java.lang.Exception.

重写方法需要抛出与原方法所抛出异常类型一致异常或不抛出异常。

  一个方法是否显示抛出异常对于重写是没用影响的,只是对调用者有影响,
对于使用者来说如果你抛出的是一个未报告的异常那他就要必须使用trycatch来捕获异常了。
而且你要注意如果说你显示抛出一个UnsupportedOperationException之类的异常,
调用该方法可以不用自己来亲自捕获异常的,可以直接再往上次抛。
RuntimeException异常类以及其子类都属于此范畴,调用者可以不用自己去捕获异常的!
子类行为不能超出父类约束范畴。否者就容易乱套。就像父类的某方法公有的,
子类就不能重写改成私有的了。这就是一个约束力的问题。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
覆盖它的方法必须扔出相同的异常或异常的子类。
其实理解这个很简单,比如说宪法规定骂人只承担民事责任,到了刑法里就不能说直接枪毙了,这就是一个约束能力的问题,子类行为不能超出父类约束范畴。否者就容易乱套。就像父类的某方法公有的,子类就不能重写改成私有的了。这就是一个约束力的问题。

子集是指:类或接口的子类或子接口。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 戴振良 于 2012-2-8 23:03 编辑

谢谢大家的回答,不过我还是希望有些例子,也就是写些具体的代码,然后加点注释就行
回复 使用道具 举报
贴子就这样沉了,大家帮个忙好吗?
回复 使用道具 举报
非常感谢1、2楼的回答!理论有一些了,但是不能光说不练,看了似乎有点理解,但是我想自己写几段那样相关的代码实验一下,却无从下手,因为理解的还不够明白,所以还是恳请大家给点代码,加点注释好理解一些,再说了,回答有技术分给,我好,你好,大家好!
回复 使用道具 举报
戚雪晖 黑马帝 2012-2-10 13:11:57
7#
本帖最后由 1毫秒的价值 于 2012-2-10 13:12 编辑

假设:
class ExceptionA extends Exception
{}
class ExceptionB extends ExceptionA
{}
class ExceptionC extends Exception
{}
结构如下:
Exception
     --ExceptionA
            --ExceptionB
     --ExceptionC

1.一个方法被覆盖时,覆盖它的方法必须扔出相同的异常或异常的子类。
class Fu
{
    void show()  throws ExceptionA
    {}
}
class Zi extends Fu
{
   void show() throws ExceptionA//也可以抛B,但不可以抛C
   {}
}
2.如果父类扔出多个异常,那么重写(覆盖)方法必须扔出那些异常的一个子集,也就是说不能扔出新的异常。
class Fu
{
    void show()  throws ExceptionA,ExceptionC
    {}
}
class Zi extends Fu
{
//以下可以抛(A和C)或者(A)或者(C)或者(B,C)或者(B)或者(什么也不抛),除了A、C以及他们子类 以外的就不能抛
   void show() throws ExceptionA,ExceptionC
   {}
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
侯丽星 黑马帝 2012-2-10 14:51:28
8#
其实你这个问题,在“黑马程序员_毕向东_Java基础视频教程第10天-03-面向对象(异常-覆盖时的异常特点)”这集视频中有详细解答。
(1)java之所以做第一个规定,个人感觉是为了提高程序的可扩展性。当然子类覆盖父类的方法时,可以抛出其他异常,但必须在子类方法中自行解决。
(2)假设父类的一个show方法抛出了AException,BException,CException3个异常,那么该父类的一个子类覆盖show方法时,只能抛出以下情况的异常:
{AException(或AException的子类),BException(或BException的子类),CException(或CException的子类)}
{AException(或AException的子类),BException(或BException的子类)}
{AException(或AException的子类),CException(或CException的子类)}
{BException(或BException的子类),CException(或CException的子类)}
{AException(或AException的子类)}
{BException(或BException的子类)}
{CException(或CException的子类)}
回复 使用道具 举报
戴振良 黑马帝 2012-2-10 20:35:15
9#
1毫秒的价值 发表于 2012-2-10 13:11
假设:
class ExceptionA extends Exception
{}

非常感谢!我要的就是这样的代码加注释,一下子就看明白了,谢谢!!
回复 使用道具 举报
侯丽星 发表于 2012-2-10 14:51
其实你这个问题,在“黑马程序员_毕向东_Java基础视频教程第10天-03-面向对象(异常-覆盖时的异常特点)”这 ...

也非常感谢您的回答,因为也非常地详细,正如我所问,把可以扔的一个子集都完完全全写出来了,这也是我想要知道的,非常谢谢!!
关于您的:(1)java之所以做第一个规定,个人感觉是为了提高程序的可扩展性。当然子类覆盖父类的方法时,可以抛出其他异常,但必须在子类方法中自行解决。     过里您说可以抛出其他异常,和张孝详老师的就有冲突了,您能否举个例子呢(写出代码)!
回复 使用道具 举报
戴振良 发表于 2012-2-10 20:39
也非常感谢您的回答,因为也非常地详细,正如我所问,把可以扔的一个子集都完完全全写出来了,这也是我想 ...

看这集视频“黑马程序员_毕向东_Java基础视频教程第10天-03-面向对象(异常-覆盖时的异常特点)”,毕老师的这集视频讲的很详细,也不长,你可以去看看,里面有详细的例子呢。
回复 使用道具 举报
嗯,好的,谢谢!!
回复 使用道具 举报
1.“覆盖它的方法必须扔出异常的子类”这一句不太理解,大家给举些例子呀?
我是这样理解的父类与子类是继承关系,那么子类是父类的具体应用,那么父类的异常,在子类中也应具体表现。
2.扔出一个子集是怎样的?什么叫子集呀,大家给举些例子呀!
如果父类异常太多,作为子类也不知调用哪个异常,直接给他来个概括,让他自己从这里选。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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