为什么java中Exception的对象能够获取子类的信息.
发布网友
发布时间:2022-04-29 01:11
我来回答
共3个回答
热心网友
时间:2022-06-27 06:06
首先要明白异常的抛出与捕获机制:
当我们没有在程序中主动使用throw或throws关键字抛出一个异常时,异常一般都是有JVM,即java虚拟机抛出的,我们所写try catch语句块只是用来捕获异常的。JVM在抛出这个异常信息之前会对异常做封装处理,确定异常时什么类型的异常。比如,此题JVM抛出的就是一个ArithmeticException,然后就查看程序能捕获什么类型的异常(就是catch语句块的参数),如果程序能捕获的异常类型恰好就是这种异常或者包含这个类型,就把这个异常传递给程序处理(本题中就是封装进了e对象中),以便程序能继续运行下去。要是程序没有对这种异常进行捕获或处理,程序就会报错,并终止执行。
由于Exception类是所有异常信息的父类,所以当在catch语句的参数适用Exception 时,表示该程序能够捕获任何类型的异常,当然也包括了ArithmeticException。其实,ArithmeticException是直接继承的RuntimeException,而RuntimeException才是直接继承至Exception,如果把程序中的Exception换成RuntimeException,输出结果是一模一样的。
也许说的有点绕,好好体会下。追问也就是说;我申明了这个Exception e,然后jvm检查这个异常是什么类的异常,查出后jvm自动创建了这个子类对象,使 e成为上转型对象?
追答不是,那个子类对象是JVM在异常抛出时创建的,他把这个异常封装成了一个Exception子类的对象,然后才是你说的上转型,把这个对象的赋给e。e只是一个引用,不是对象,java中允许父类的引用接收子类的对象。
热心网友
时间:2022-06-27 06:06
这个是java的多态问题,你自己随便写个 接口 or 抽象类 or 普通类,在里面定义一个方法,然后再用一个类去继承它,并且覆写里面的方法
之后用子类去创建父类对象,也就是
父类 父类对象名 = new 子类();
然后调用被覆写的方法,你看看是不是调用的子类的方法,而不是父类的
这里一个道理,Exception是java中各种异常的父类,其他各种异常都是他的子孙类,自然输出的是子类的信息追问你说的是上转型吧;
也就是说;我申明了这个Exception e,然后jvm检查这个异常是什么类的异常,查处后jvm自动创建了这个子类对象,使 e成为上转型对象?
热心网友
时间:2022-06-27 06:07
这就是java的多态表现,这个范围很大,不是三言两语说清楚的
以后你有经验了,很多东西水到渠成,自然理解了