为啥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成为上转型对象?

参考技术B 这就是java的多态表现,这个范围很大,不是三言两语说清楚的
以后你有经验了,很多东西水到渠成,自然理解了

以上是关于为啥java中Exception的对象能够获取子类的信息.的主要内容,如果未能解决你的问题,请参考以下文章

Throwable和Exception

java中的String类型的对象为啥可以自动转换成Object类型的?而Object却要强制转换成String类型的

在java 中子类对象为啥不能比父类对象有更严格的访问权限?

为啥java的子类中必须调用父类的构造方法

Java中子类重写父类的方法为啥返回值类型要小于等于父类方法的返回值类型?

异常