一.
异常就是不正常,不正常在哪儿?之前在哪儿见过不正常?
举一个之前的例子,来引入异常这个知识点。
截图中的例子,是我们学习数组时所碰到的一个问题,超出数组的索引上限。控制台上编译是没有问题的,但是运行出现了问题。
数组角标超出范围的专业名称是角标越界。控制台上的英文显示为ArrayIndexOutOfBoundsException,exception就是异常的意思,而且告诉我们3越界了。出现异常的文件名<ExceptionDemo.java:9>。
异常表现:在控制台上可以看出异常表现。谁越界了,越界的位置在哪儿。
上面是一个最简单的异常变现,现在我们可以得出一个基本的结论。
现在对程序做一个小的修改,添加了arr=null;编译结果如下
DOS控制台上的结果依旧显示越界。这结果是没有问题的,因为数组为空,输出数组的第三个元素肯定是不可能存在的。
一定要记住,异常是在哪个时间段发生的。先不讲述语法,先讨论一下为什么会有异常的发生。
(视频讲到这里,整体的流程遵循的还是三问,是什么,为什么)
java当中为什么会有这个知识点呢?
无论是生活中,还是计算机当中,总会有一些异常诞生。通常我们会预先给出一些解决办法。计算机是描述日常生活,生活中有异常也有解决办法,计算机中同样也有。
本来sleep方法中,正常来说输入的都是正值,但是也不排除输入的是负值,这样就出现问题了,这种就是意外情况。
对于整个过程而言,会出现很多问题。那么就需要在程序中完善很多语句,对出现的异常情况进行维护。如果出现这样的情况,该怎么解决。其中还有一点需要注意,对于函数声明而言,返回值和返回值类型也是很重要的。这里对不同情况的处理,应该给出具体的返回值,因此,void应该要更换一下,应该是有返回值。
sleep()方法中的语句,是我们早期处理问题的一种方式。这种方法有一些劣势。它的阅读性不好。真实的情况中,处理的办法语句有很多,一大堆。
为什么觉着这些代码麻烦呢?因为方法体的众多语句中,真正需要的就是一句(正常的流程代码),System.out.println("我睡....."+num),其他的都是作为健壮性的代码存在。
问题处理代码和正常流程代码结合的很紧密,这样读起代码来很不舒服。光读一个if,就读了大半天。因此,在java中对这种情况进行了改良。
怎么改良呢?将这样常见的情况问题,用面向对象的思考方式,对其进行了描述以及封装。对于java而言,万物即对象。如果我们程序中出现了问题,那么问题是不是对象?问题啥对象啊?问题对象有啥啊?仔细想一下,首先这个问题叫什么名字?紧跟着这个问题所涉及的具体信息,这个问题发生的位置。这些都是问题的特点。找到问题对象,就意味着这些信息都可以拿得到。这就是对象的封装。因此,我们不再做这件事情了。java中按照面向对象的方法,对这些问题进行了封装。以对象的形式来体现。
搞个类Futime,来描述时间为负数的情况下,我们该怎么去办。if里面不用再搞一堆处理办法,修改过后的程序如下:
设计成这样的形式,就简单多了。接下来的问题是,谁在调用sleep功能?调用者在调用这个功能时,当出现负时间的情况下,要给调用者反馈一个信息。当是负时间的时候,抛出一个问题对象。你告诉我小于0,我直接把封装的对象告诉你。按照程序的流程来看,出问题了。出现了问题,抛出一个对象,最后又输出睡觉了,这明显是不对的。
c语言是通过if处理方法和输出语句紧密结合在一起,而java是把问题封装成对象,通过抛出的形式,让调用者知道,这就是异常。
(我们在程序中并没有书写异常类,怎么dos运行的时候直接就抛出了异常类?是系统自带的么?)
情况名称不一样,信息不一样,位置不一样都要进行单独地描述。
总结:本节这是对异常进行了简单描述。交代了异常类的定义,以及为什么会有异常类的出现。具体怎么操作异常类并没有进行详细地介绍。