一道面试题,关于java的异常处理的
高洛峰
高洛峰 2017-04-18 10:39:23
[Java讨论组]
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(4)
大家讲道理

throw new Sneeze();

为何不能被?

} catch (Sneeze s) {
  System.out.println("Caught Sneeze");
  return;
}
伊谢尔伦

你对Java的类这个概念了解还不够,Sneeze是Annoyance的子类,意味着Sneeze一定是Annoyance,所以参数类型为Annoyance的时候,传递进去一个Sneeze实例并没有什么问题,这个实例在被抛出的时候当然会被捕获。有一段类似的代码你可以看看。

class Animal  {
    void talk(){
        System.out.print("I'm Animal");
    }
}
class Human extends Animal {
    void talk(){
        System.out.print("I'm Human");
    }
}

class Main{
    public static void main(String[] args) throws Exception {
        bark(new Human());
    }

    static void bark(Animal a){
        a.talk();
    }
}

在上面的代码中,为什么最后会打印I'm Human而不是I'm Animal

ringa_lee

这里没有做任何的类型转换,打印Caught Annoyance之后抛出的仍然是之前的对象,只是由父类型引用了。
你描述的情况是下面的情形:

public class Human {
    public static void main(String[] args) throws Exception {
        try {
            try {
                throw new Sneeze();
            } catch (Annoyance a) {
                System.out.println("Caught Annoyance");
                throw new Annoyance();
            }
        } catch (Sneeze s) {
            System.out.println("Caught Sneeze");
            return;
        } finally {
            System.out.println("Hello World!");
        }
    }
}
伊谢尔伦

这个应该是下转型的问题

题主的问题简化成下面的样子会清晰点

Annoyance a=new Sneeze();
Sneeze s=(Sneeze)a;
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号