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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ☆枫の云 金牌黑马   /  2014-5-12 10:53  /  4680 人查看  /  22 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ☆枫の云 于 2014-5-13 09:50 编辑

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

22 个回复

正序浏览
张然龙 发表于 2014-7-31 22:41
对于重写方的法来说,不能抛出新的异常或者比被重写方法声明的异常范围更大的异常。

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

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

点评

哈哈哈...  发表于 2014-8-1 12:44
回复 使用道具 举报

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

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

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

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

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

解决思路就是:子类重写父类的方法时声明抛出异常不能比父类范围大
回复 使用道具 举报
这个问题以前也没思考过也没遇到过,不过长见识了
回复 使用道具 举报
温水煮青蛙 发表于 2014-5-13 11:00
建议你看看《JAVA编程思想》,异常章节专门着重介绍了这个内容。能很好的回答你这个问题。 ...

我怎么没找到呢?请问在哪一页?
回复 使用道具 举报
同求解答
回复 使用道具 举报
136616244 发表于 2014-5-14 23:26
这本书价格多少?  我在网上看好几百块大洋呢英文版的?京东上的纸张好像不是很好?你在那买的,纸张怎么 ...

我在京东买的 好像好了九十多,评论上说纸张不好,实际上我买的还不错的~~
回复 使用道具 举报
温水煮青蛙 发表于 2014-5-13 11:00
建议你看看《JAVA编程思想》,异常章节专门着重介绍了这个内容。能很好的回答你这个问题。 ...


这本书价格多少?  我在网上看好几百块大洋呢英文版的?京东上的纸张好像不是很好?你在那买的,纸张怎么样?
回复 使用道具 举报
楼主技术分黑马币换的吧,我也是: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");
        }
       
}
回复 使用道具 举报
:P楼主举例好形象啊,遗传问题,这个也行基因突变呢?哈哈,生出个天才啦也说不准呢。学习一门语言,就得遵守它的规定守则吧,除非你自己开发一门语言,你是创始人定义规则,我们来学习遵守、、、、、
回复 使用道具 举报
建议你看看《JAVA编程思想》,异常章节专门着重介绍了这个内容。能很好的回答你这个问题。
回复 使用道具 举报
这个可以从类的继承与多态来理解,子类其实也是一种父类类型,如果子类可以比父类抛更多的异常,则说明其它子类也需要处理该异常,因为其他子类也是父类类型,这样做的话明显不符合JAVA程序的低耦合性。
回复 使用道具 举报
波涛 中级黑马 2014-5-13 09:34:09
9#
上面几个人的比喻很恰当的啊,你爸没有的遗传病在你身上也是不会有的(不考虑基因突变等特殊情形)。所以你爸说了他没病,你就不能说你有病了(怎么这么扭)。子类抛出的异常类型不能比父类抛出的异常类型更宽泛!
回复 使用道具 举报
一般规定
回复 使用道具 举报
Jero 中级黑马 2014-5-12 20:22:34
7#
这个问题 你没代码 简单的来说就 是 你爸爸没有的东西 你身上肯定不会有哦。
回复 使用道具 举报
就跟数学里面1+1=2一样  
回复 使用道具 举报
这是规定啊
回复 使用道具 举报
java就是这样规定的啊,
回复 使用道具 举报
就好比遗传什么的,你父亲没有遗传性的病,怎么可能遗传到你呢,对不对

点评

有见地,这个理解很易懂  发表于 2014-5-13 09:49
回复 使用道具 举报 2 0
这个是java约定的方法重写(overide)规则,人为规定的,没有为什么,就像为什么java程序执行的入口是main()方法一样。

java约定的方法重写(overide)规则如下:
  • 子类方法返回值类型应比父类方法返回值类型更小或相等
  • 子类方法声明抛出的异常应比父类方法声明抛出的异常类更小或相等(甚至不抛出)

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

点评

不错,规定说的挺明确  发表于 2014-5-13 09:47
回复 使用道具 举报 2 0
您需要登录后才可以回帖 登录 | 加入黑马