JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

时间:2022-05-04 16:20:02

一.

谈论完异常的体系后,现在我们讨论之前出现的一些异常是怎么来的。底层的运行原理是怎么回事,做个了解。

以之前的角标越界例子来讲述底层原理,

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

从结果看,编译是没问题的,运行出现了问题。

控制台告诉了我们很多信息:交代了源文件的名称,也交代了函数的名称,以及位置(哪一行)。有人说这是一样的。

我疑惑的是怎么两个地方出错了,以我的理解来看,只有一个地方出错。

对于上面的疑问,更换一种程序书写方式,来讲解,(这是通过两个类,创建对象的方式来操作的)

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

DOS中的at,意味着出错的位置,交代了源文件中的哪个方法,以及源文件中的位置。

接着讲述一下图解,直接讲述异常过程,创建数组什么的不再介绍。

当运行到d.method(arr, 3)时(对象调用相应的方法,把arr和3角标传入函数),method方法就进栈了。在运行method()的方法体时,发现数组中不存在3这个角标,这是个问题。java本身识别这个问题,是因为java之前已经建立了关于这个问题的描述。

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

其他的过程都不再赘述,现在只是重点讲述一下,出现错误语句时那部分的计算机运作。对于出现的角标越界的问题,虚拟机在这出问题的地方,进行了一个对象的封装。虚拟机创建了一个角标越界的描述类对象,同时输入了越界的角标(这里强调一点,新建对象的后面的括号代表着构造函数初始化,括号里面的参数列表意味着进行哪种初始化过程。)  在这里new了一个对象,那么这个对象给谁,如果不给调用者,放在这里没有任何用处。那么调用者是谁,是主函数(虚拟机调用主函数,主函数调用它→虚拟机调用主函数,主函数进栈,主函数调用method方法,method也进栈了,这个方法就在栈顶上,主函数在栈底下。上面的部分不运行完,下面的部分就没法运行。上面的方法没有运行完,怎么运行主函数,主函数没有运行完,jvm就没法退出) 怎么抛出这个东西呢?其实这里有个throw存在。

虚拟机由于认识问题,先是封装问题,接着通过throw将其扔出。

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

扔出的问题对象交给了主函数,主函数处理不了,就交给了虚拟机。虚拟机就是终点,它将启动默认的异常处理机制,把它处理掉。

这个处理机制是怎么处理的?把这异常对象所涉及的相关信息,名称和位置,全都输出到控制台上,让运行的人看到。程序员看到了,就解决问题。真实开发中,会将这些信息存储到日志中,便于程序员查阅,程序员看到这样的问题后可以对其进行该进,使用者是看不懂这样的句子的。

一共就两步,遇到识别的问题,就进行封装,第二步,就是把这个问题抛给调用者,这个动作是虚拟机独立完成的。如果调用者没有处理的话,继续往下抛,最终到虚拟机这就停下来了。

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

对程序再次进行修改,添加了两个输出语句,一个是输出“haha”,另一个是输出“over”。

说都输出的,以及输出“over”刚才都没听懂,下图是编译运行后的结果,

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

既没有“haha”也没有“over”,为什么呢?异常的发生也是可以将函数停止的,以前是return。

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

之前结束函数时,都是靠的return,现在都是靠着抛出操作结束的,这就是异常跳转。

到这里运行的基本问题就搞定了。

二.

我们能不能自己做这些动作,书写抛出语句什么的。如果满足一定的条件,我们可以做自己的手动操作动作。

接着在程序里面搞点小玩意儿,给大家做点演示。

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

(这里存在着问题,为什么会出现两个错误,第19行和第8行都是错误的,19行可以理解,第八行不能理解?)

还有为什么要手动抛出?下图中发现,数组角标越界的构造中可以不带参数列表

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

我们在程序中进行了修改,手动抛出,

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

我们这个手动的结果,在控制上没有任何信息,没有3。

 JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

JAVA-初步认识-第十一章-异常-原理异常对象的抛出throw

对象的异常信息我们可以自定义。

总结:这里谈论的是异常背后的原理,以及运行的流程。包括自动的和手动的抛出,还有关于问题描述类对象在创建时,里面有三个构造函数,三种不同的参数列表。构造函数都是直接将参数列表中的内容全部输出(为什么能输出参数列表,很奇怪?)