黑马程序员技术交流社区

标题: 父类没抛异常,子类为什么不能抛异常? [打印本页]

作者: ☆枫の云    时间: 2014-5-12 10:53
标题: 父类没抛异常,子类为什么不能抛异常?
本帖最后由 ☆枫の云 于 2014-5-13 09:50 编辑

如题,有没有大神来个浅显易懂的解释=.=

作者: jieyu90    时间: 2014-5-12 12:03
这个是java约定的方法重写(overide)规则,人为规定的,没有为什么,就像为什么java程序执行的入口是main()方法一样。

java约定的方法重写(overide)规则如下:

你说的那种情况很明显违背了第二条规则


作者: ς高眼光の目标    时间: 2014-5-12 13:47
就好比遗传什么的,你父亲没有遗传性的病,怎么可能遗传到你呢,对不对
作者: 张耀扬    时间: 2014-5-12 13:59
java就是这样规定的啊,
作者: 嗯√低调〆    时间: 2014-5-12 16:15
这是规定啊
作者: GGdog    时间: 2014-5-12 19:18
就跟数学里面1+1=2一样  
作者: Jero    时间: 2014-5-12 20:22
这个问题 你没代码 简单的来说就 是 你爸爸没有的东西 你身上肯定不会有哦。
作者: 种一棵树    时间: 2014-5-12 23:44
一般规定
作者: 波涛    时间: 2014-5-13 09:34
上面几个人的比喻很恰当的啊,你爸没有的遗传病在你身上也是不会有的(不考虑基因突变等特殊情形)。所以你爸说了他没病,你就不能说你有病了(怎么这么扭)。子类抛出的异常类型不能比父类抛出的异常类型更宽泛!
作者: 温水煮青蛙    时间: 2014-5-13 10:59
这个可以从类的继承与多态来理解,子类其实也是一种父类类型,如果子类可以比父类抛更多的异常,则说明其它子类也需要处理该异常,因为其他子类也是父类类型,这样做的话明显不符合JAVA程序的低耦合性。
作者: 温水煮青蛙    时间: 2014-5-13 11:00
建议你看看《JAVA编程思想》,异常章节专门着重介绍了这个内容。能很好的回答你这个问题。
作者: 大漠孤烟    时间: 2014-5-13 19:55
:P楼主举例好形象啊,遗传问题,这个也行基因突变呢?哈哈,生出个天才啦也说不准呢。学习一门语言,就得遵守它的规定守则吧,除非你自己开发一门语言,你是创始人定义规则,我们来学习遵守、、、、、
作者: 136616244    时间: 2014-5-14 23:24
楼主技术分黑马币换的吧,我也是:lol


举例说明:

public class Demo {
        public static void main(String[] args) {
               
                Demo d = new Demo();
                d.show(new Fu());
                //问题在这
                d.show(new Zi());
                //如果父类没有抛出异常那么调用父类的方法就不用声明或处理,而这时后加进来的子类抛出异常的话在调用时就会出错!
               
        }
        void show(Fu f){
                f.method();
        }
       
}
class Fu{
        void method(){
                System.out.println("fu run");
        }
}
class Zi extends Fu{
        void method() throws Exception{
                System.out.println("zi run");
        }
       
}
作者: 136616244    时间: 2014-5-14 23:26
温水煮青蛙 发表于 2014-5-13 11:00
建议你看看《JAVA编程思想》,异常章节专门着重介绍了这个内容。能很好的回答你这个问题。 ...


这本书价格多少?  我在网上看好几百块大洋呢英文版的?京东上的纸张好像不是很好?你在那买的,纸张怎么样?
作者: 温水煮青蛙    时间: 2014-5-15 08:43
136616244 发表于 2014-5-14 23:26
这本书价格多少?  我在网上看好几百块大洋呢英文版的?京东上的纸张好像不是很好?你在那买的,纸张怎么 ...

我在京东买的 好像好了九十多,评论上说纸张不好,实际上我买的还不错的~~
作者: 菠萝包丶    时间: 2014-5-15 10:48
同求解答
作者: jiang_ming    时间: 2014-5-15 19:31
温水煮青蛙 发表于 2014-5-13 11:00
建议你看看《JAVA编程思想》,异常章节专门着重介绍了这个内容。能很好的回答你这个问题。 ...

我怎么没找到呢?请问在哪一页?
作者: Bule丶    时间: 2014-7-31 17:21
这个问题以前也没思考过也没遇到过,不过长见识了
作者: 张然龙    时间: 2014-7-31 22:41

对于重写方的法来说,不能抛出新的异常或者比被重写方法声明的异常范围更大的异常。

但是可以抛出更小或者不抛出异常。

这个问题涉及到了多态, 如果其他类调用这个子类方法构成了多态,

如果你定义多态传递的是父类对象,而调用的父类方法没有声明异常,则程序员主观认为没有异常发生,则不会try也不会throws抛出异常.

而如果你传递的是子类子对象,调用子类覆盖后的方法刚好抛出了个异常,而没有进行try也没有进行throws,
编译就会报错,这就是最大的问题.

解决思路就是:子类重写父类的方法时声明抛出异常不能比父类范围大
作者: ☆枫の云    时间: 2014-7-31 23:42
张然龙 发表于 2014-7-31 22:41
对于重写方的法来说,不能抛出新的异常或者比被重写方法声明的异常范围更大的异常。

但是可以抛出更小或者 ...

额..虽然我这都是老帖了,还是谢谢大神的慷慨解答:lol




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2