为啥java中Exception的对象能够获取子类的信息.
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥java中Exception的对象能够获取子类的信息.相关的知识,希望对你有一定的参考价值。
如:
try
int i=9;
i/=0;
catch(Exception e)
System.out.println(e.getClass()+“ ”+e.getMessage())
会输出 class:AmethticException /by zero
当我们没有在程序中主动使用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中允许父类的引用接收子类的对象。
参考技术A 这个是java的多态问题,你自己随便写个 接口 or 抽象类 or 普通类,在里面定义一个方法,然后再用一个类去继承它,并且覆写里面的方法之后用子类去创建父类对象,也就是
父类 父类对象名 = new 子类();
然后调用被覆写的方法,你看看是不是调用的子类的方法,而不是父类的
这里一个道理,Exception是java中各种异常的父类,其他各种异常都是他的子孙类,自然输出的是子类的信息追问
你说的是上转型吧;
也就是说;我申明了这个Exception e,然后jvm检查这个异常是什么类的异常,查处后jvm自动创建了这个子类对象,使 e成为上转型对象?
以后你有经验了,很多东西水到渠成,自然理解了
以上是关于为啥java中Exception的对象能够获取子类的信息.的主要内容,如果未能解决你的问题,请参考以下文章
java中的String类型的对象为啥可以自动转换成Object类型的?而Object却要强制转换成String类型的
在java 中子类对象为啥不能比父类对象有更严格的访问权限?