00:00
好,那么第二阶段的面向对象呢,咱们就告一段落,接着我们来看一下这个第三个阶段,虽然说第二阶段呢,我们涉及到这个章节比较少,但是内容量呢其实并不少,第三个阶段的话呢,我们就可以看作基于Java的语法规则呢,做的一些具体场景的应用了,这呢我们一共列出来了很多的章节啊,那首先的话呢,我们来看第一个章节,叫做异常处理,也是我们现在呢要讲的这样的一个章节了。这个章节里边呢,我们看看主要要讲哪些东西啊,首先的话呢,我们要明确一下说异常处理啊,讲究处理之前呢,先看一看什么是异常,来了解一下整个这个异常的一个体系结构啊,这呢就我们说的这样的一个场景,这是了解的,了解完以后的话呢,我们首先做处理之前,先看看都有哪些常见的异常啊。哪些?啊,有一个感官的一个认识啊,然后这块的话呢,其实也会涉及到呢,在呃,笔试面试的时候呢,有时候可能会问你啊,所以开发当中你都见过哪些异常啊。你总不至于抛一句说我基本上没有出过一场吧?啊,这有点不可能的哈,那只有可能是你写的代码少,写少了你才不会出现啊。
01:04
好,那知道呢,我们出现哪些异常之后呢,我们下一步呢,就得看如何去处理异常了,那处理异常的话呢,大的方向来看,其实有两种方式,一种呢叫trackage finally啊这个对应的我们这块的内容了,然后另外一种呢,叫做ROS的方式。啊,这呢是两种处理的方式,这呢也是我们这一章啊要讲解的重点。这个完了以后的话呢,我们有相应的一些补充的内容,比如说这个我们抛出的这个异常对象哈。诶,可以呢,是自动抛的,还可以呢,是手动抛的,所以呢,我们还可以在相应的一些程序的位置上,我们主动的去抛出异常对象。可能有的人会想说,这不有病吗?是吧,本来呢,我们就不想出异常,出了异常呢,还得想法去给他处理,那你现在可好,自己主动抛异常是吧?啊,这是什么场景呢?这个咱们到时候呢再说啊,但我们抛出的这个异常呢,可以呢,是系统给我们提供现成的一些类,也可以呢,是我们自定义的,所以我们在讲一个补充的内容,叫做自定义异常类。
02:06
哎,相应的有些这个练习就可以了。那其实这章的内容的话呢,大家来看其实也不多啊,就完事了啊,最后呢,我们做一个总结,然后呢,我们第三个阶段呢,也会有个项目,这个项目呢,就呈现在我们这个异常处理这个位置了。哎,这就可以了啊好,这块我们就知道这一章呢主要讲哪些内容了,那回到我们这个课件层面啊,我们就一个一个来,首先来看一看,说异常的一个概述。呃,首先呢,我们从生活呢去引入哈,说什么是生活当中的异常。说呢,男主角啊,小明每天呢开车呢上班车程呢一个小时啊,不出意外的话呢,出现意外了。可能会堵车,可能没油了,可能出现交通事故了啊,这呢都是一些意外情况。就是凡是我们不希望出现的这种场景啊,非正常的这种情况都称为呢,叫异常了。那出现以后怎么办呢?这个你得相应的得有一些处理的方案了,比如说堵车了,换路或者等待没油了啊去加油站呢,去加油,出现交通事故了,找这个交警呢,给你去解决,然后就到他的公司了。
03:08
啊,这个是我用的北京的这个。哎,望京的SOHO啊。哎,这个楼呢,比较漂亮一些啊好,这呢就从家里出来呢,去上班这个过程,那这呢就叫做生活当中的异常,然后这个蓝色的话呢,就是生活当中异常的一个处理的方案。好,那下边我们回到这个程序的角度来看。说呢,在程序执行过程当中啊,我们希望呢,把这个代码呢,写的尽善尽美。但是的话呢,在系统的运行过程当中,仍然会遇到一些问题,这个运行出现这个问题啊,不是我们说靠代码就可以避免的,比如说。客户呢,输入的数据的格式问题。啊,明确呢,我们要求呢,比如说咱们使用这个scanner啊,简单来理解一下,这个scanner的话呢,我们就想获取一个int型的值,那我们就调这个next int这个方法了。奈何呢,用户呢,就写了个ABC。是吧,那这时候呢,我们以一个印的方式去获取的时候呢,它就会出现一个异常了。
04:04
啊,下一个啊,说读取文件呢,是否存在。说呢,我们写这个程序呢,从相应的磁盘上读一个文件了,本来这个文件还存在呢,结果呢,之后呢,一不小心使用一些清理垃圾的一些软件呢,就把我们这个文件呢给删掉了,那我们通过程序呢,再去读的时候呢,立马就出现一个异常,说我要读的文件呢不存在。啊就不正常了啊,再者说呢,就是网络呢,是否始终保持通畅正常,我们在测试的时候呢,都没问题啊,因为网络呢都是通畅的。结果呢,现在这个网络啊不太好,这个时候呢,我们这个数据呢,就可能发送不过来了,就出现问题了。啊,那么这些的话呢,其实都是一些客观的一些场景,这些场景呢,不是因为我们这个代码呢,写的不够完美。啊,就是一些我们难以避免的一些突发情况。OK,所以呢,既然会出现这样的问题,我们就得考虑如何去处理了。好,下边呢,首先我们明确一下,什么叫程序当中的异常啊,指的呢,是程序在执行的过程当中出现呢非正常的情况,如果呢,要是不处理,最终呢,就会导致GM的非正常停止。
05:06
啊,就是我们这个程序呢,在执行的时候呢,其实呢,我们都啊,后边要讲概念的就是一个进程了啊。就是一个运行中的程序啊,其实就是一个进程啊,这个程序在运行过程当中,你出现一些异常了,然后你要不处理它就会把这个进程呢给它就停止掉,这个一个进程呢,其实它就会对应的一个GM的一个实例了,那进程都停了,实际上呢,主要原因是因为我们这个GM呢就停止了。啊,整个这个成绩呢,就结束了。那就这样的啊,在我们为了不让这个进程呢去结束,我们就需要呢考虑如何去处理一场。OK啊,哎,你也可以想象中就像我们人一样啊,人在正常情况下呢,都可以,哎工作呀生活呀都没有问题,结果呢,你突然有一天生病了,生病的话呢,其实就相当于一个异常,那你就是哎吃药治好啊,治不好的话呢,这个就躺平了,就。Over了就是吧。啊,就这样个情况啊。好,那么这里边儿呢,要格外的强调一下啊,我们现在所说的这个异常啊,它是不等同于咱们的语法错误和逻辑错误的啊。
06:06
什么叫语法错误呢?比如说你这块呢,去写的时候呢,我少了一个分号。啊,少了一个大括号,这个呢,都算是这个语法层面的错误,这个咱们不算啊。这个纯粹就是你少这个语法的这个结构了啊,另外一个呢,就是你说这个逻辑的错误,比如说呢,本来让求这两个数的和,结果你写成了A减B了,说这个呢,算不算异常,这也不算,这个纯粹就是你自己设计的时候呢,你的代码逻辑设计的是有问题的,这些都不算。啊,先注意一下。好,那么这呢,就我们说一下这个异常的一个概念问题啊,那异常这个概念问题呢,说清楚之后呢,我们接着来看一看,说呢,我们程序在执行过程当中,如果出现了异常了,那该怎么办呢?啊该咋处理呢?他们不是说了,要不处理的话呢,GM不就停了吗。啊,就出现这样的情况了,好这块呢,首先呢,我们先明确一下这个异常呢,它出现的时候呢,它的一个场景啊说呢Java呢,把不同的异常用不同的类呢来进行表示。
07:03
哎,其实这一句话下去呢,咱们就可以作为一个叫万事万物皆对象的一个例子了。这个所谓的异常这种情况呢,在我们Java当中也是用对象来呈现的啊好,那么一旦要是发生某种异常的话呢,我们就会创建你相应的异常这个类型的一个对象。并且呢,把这个对象给你抛出来。哎,抛掉以后怎么办啊?啊,就看你想怎么处理了,你说我不处理,那不处理那就挂掉了啊,GM呢就停了。啊,你说行,我处理行处理怎么处理呢,这个呢,我们可以呢,对这个异常对象呢,进行一个补货。啊,这个用的一个关键词呢,叫做catch啊,那一旦捕获以后的话呢,我们就可以呢,指明这个异常出现了,我们该如何呢去处理,指明相关的处理的逻辑。哎,就行了。哎,所以说呢,这块呢,你说诶我们这个出现异常以后怎么处理呢,其实大方向来讲呢,算是有两种方式啊,第一种方式那就不处理。哎,第二种方式的话呢,就是我们主动的去做这个处理。
08:02
啊,所以就跟生活中一样啊,生活中你遇到一个事儿了,你说哎呀,我不知道该怎么选择了。你不做任何的选择,其实也是一种选择是吧?啊,这个你比如说现在有呃两个女生去追你是吧。然后呢,你不知道该选哪个,这个呢就是温柔体贴又贤惠,这个呢就是。身材挺好的是吧,哎,不知道该选哪个了,哎,不知道该选哪个,你就在这儿一直等待,其实也是一种选择啊,最终结果呢,可能说就都走了是吧。这个我曾经在大学呢,遇到过一个这种情况是吧。对,当时我的选择呢,就是不做选择,结果呢就都没有了是吧,然后后来我就好几年都是单身是吧?啊OK啊好诶那么这也是一种选择,那就是躺平是吧,那就停止就完了,当然我们这一章呢,讲的叫异常处理,那肯定是要主动来处理的,那关键问题就是我们要看一看该如何去处理了是吧。好,下边这块我举个例子啊,这个例子呢,在课件中放一放,诶我呢就具体不说了,咱们下面呢,其实讲的都是这个问题了。
09:06
好诶我们呢,要做这个处理,处理完以后的话呢,我们使得整个这个程序的代码呢,就更具备这种健壮性啊,诶这个没问题了啊,这呢就我们说关于异常的一个基本的一个情况啊,那对应到我们这个代码层面啊,咱们还是有两个这个mole哈,在下边儿这个呢,打开,呃第一个啊,第一个呢叫异常处理的概述啊,这呢我们有几个相关的这个问题是吧?诶大家呢,可以把相应这个呢去填一填,比如第一个啊说什么是异常。啊,这块我们在这个位置,嗯,在这儿啊,写了这样一句话。啊这呢就做一个了解就行啊,啊下边呢,什么叫异常的抛出机制啊,就是我们程序呢,在执行过程当中一定要出现异常呢,他就会把这个呃异常的对应的类型的对象呢给他抛出出来啊这呢其实就是一个抛出的机制的问题,抛出了以后呢,我们就可以呢去做这个补货的处理了。哎,这样场景,那如何对待这个异常,其实呢,就相当于指出来我们该如何去处理啊,一一个方式呢,就是我们不处理。
10:02
啊,那程序呢,就终止了,另外一个呢,就我们去处理是吧,就这个事儿啊。啊,这个呢比较好理解。这个再往上拽一下啊。诶这样好就行了,好,那么接下来话呢,我们就开始要讲,嗯,这里边的遇到的两个场景,第一个的话呢,首先提到的话呢,就是一旦你要出现异常的话呢,他就会把当前的异常的对象呢,给它抛出出来,异常的类型到底都有哪些呢?这块儿我们有必要呢去了解一下异常的一个体系结构啊,那么一条到一提到这个异常的体系结构的话呢,这块我们首先呢提到一个类,这个类呢叫做sable。它呢是在这个浪包下的有这样的一个类,它呢是整个我们这块提到异常对应的这个类的一个根类啊,这个类的话呢,它是继承于object。啊,在整个的异常这个起义当中,它是一个到头了啊,然后呢,这个类的话呢,下边有两个子类,一个呢叫做error,一个呢叫做exception。
11:05
啊,那就意味着我们具体出现的那些类型啊,都算是它或者是它的这些子类了。OK行,那说到这儿的话呢,不妨我们就看一下这个API了啊,打开一下我们这个index。好在这个位置我们呢,去输入一下呢,叫做。那就它啊点开啊进来好,这里边呢,首先呢,提到了它是集成一个了,这没问题啊,然后呢,它有两个啊子类,一个呢叫error,一个呢叫exception,这个rope呢,我们就不过多的去做研究了,我们更多的关注的是它的这两个子类。这两个子类的话呢,这个error我们习惯把它就翻译成叫错误了。这个呢?诶翻译成叫异常了。啊,OK,好,那前面这个错误跟异常它有什么区别呢?哎,先看这个error啊。这个error的话呢,我们说呢,叫Java虚拟机无法解决的严重问题,比如说虚拟机系统内部的错误啊,资源耗尽呢,这种严重问题,注意后边这句呢,是我们要说的关键,一般呢不编写针对性的代码进行处理。
12:09
说白了啊,就是如果出现这样的问题了。就回去改代码就完了。对呀,就是我们没有办法,你说拆catch一下,就我们后边这种处理方式,对于它呢是无效的,因为呢还没办法去拆catch,因为整个呢GM都已经挂了。就跟你说呢,整个这医疗系统都已经崩溃了是吧,你现在生病了,就我要看医生,医生喊了半天,医生说我也。我也得了是吧,哎,这就整个就瘫痪了啊,你这块呢,虚拟机都已经资源耗尽了,你说GM你赶紧给我治一治,GM说我已经也结束了是吧,诶所以这种问题呢,我们处理不了啊。那典型的代表的话呢,叫做stack overflow error和auto memory啊,这个我们习惯上就叫做OOM了。哎,这呢,你看它的后缀呢,是两个具体的L啊。这种问题比较严重。好,那既然说到这儿了,咱们就举一下这个例子啊,回过来这块你看有error啊,这里边我们没有写了啊,咱们下边呢,就来给大家去举例啊。
13:07
哎,举例一啊,我们先举一个,呃,这个占一出吧,这个非常简单啊,在may方法里边,我们又调may方法啊,这不就是个递归吗?哎,那每调用一次面方法,我们就进来一个战争,然后呢,诶进来一个战争,然后呢,这个依次去调,这个战争的话呢,在我们占空间有限的情况下呢,总是会掉满的,那这个呢,就是要stack overflowed了,哎,我们做一个run。啊,这个你得往上去找,看看在哪啊。哎,应该快了吧。开头是吧,好,Stack。哎,CTRLC一下。那这个呢,我们称为它叫哎战溢出的一个错误是吧。占内存。啊,溢出的。哎,错误啊,行,就是它这个呢比较好理解,然后我们再举一个这个OM的一个例子啊。
14:02
哎,这个举例二啊,举例二的话呢,我这么着我去呢,一个bit型的一个数组。这个BY的话呢,我们说就是一个字节了啊,我幺零二四一下,这是不是就相当于是1KB了。好,然后呢,我再去乘一个。哎,1024。这就相当于是一兆币是吧,啊,1M币了,然后再乘以一个啊100。就相当于是100兆。行,这就100兆了啊嗯,然后呢,注意我们又出来这个结构呢,都是在堆空间中去分配的啊,那我现在呢,如果说这个堆空间假设不足100兆的话呢,是不是就会把这个堆空间就占满了是吧?那这时候这个堆空间就会报一个说移除了,诶这样的场景,好诶这块我们可以呢做这样的操作,诶大家做一个了解就行啊诶我点一下这个run,在这呢有个叫edit configurations啊点开。点开以后的话呢,针对于咱们当前这样一个module。是不是我用这个model啊,是不是a test,诶,它正好匹配的就是它啊好,然后在这一块的话呢,注意在这个位置啊。
15:03
我这有一个呢,叫这I的VM的options啊,就是虚拟的一个参数,呃,这块大家做一个了解就行哈,诶我这样写叫杠大XMS,我写上十兆空格一下,嗯,大XM我也写上十兆。前面这个参数呢,来设置就是堆空间的一个初始化的时候的一个大小是十兆,然后这个呢,来设的最大的一个堆空间的大小也是十兆,说白了就是固定下来就是十兆,然后OK一下,显然100兆呢不够吗?那我们做一个rap。他就挂掉了。这个呢,就是一个auto memory的一个error,然后呢,是堆空间的一个移除了。那就这样个场景,这是我们举例这个第二个这个情况啊。好,我就以这两个为例了,那我们凡是能够看到这个后缀是艾弱的呢,其实它都是一个叫错误了。你说出现这个问题,虚拟你给我解决一下,虚拟说那搞不定是吧,我内存就是十兆,你这100兆,这怎么也解决不了啊。
16:00
哎,这个呢,就挂掉了。好,整个呢,这块我们称为呢,都叫做这个错误。哎,这是他的一个场景行,哎,那么下边这个呢,叫做exception,哎,Exception是什么呢?说其他的因为编程错误,或者是偶然的外在因素导致的一般性问题,这个是我们可以编写针对性的代码进行处理的。啊,使得我们这个程序呢,能够继续的去执行。所以呢,咱们这一章呢,叫异常处理。其实呢,咱们针对的都是这个哥们儿。诶对,针对的都是这个exception啊,也就是说这个呢,我们是能处理这个就处理不了,那可能大家有的想说,那我要出一个错误信息了,是吧,比如我们刚才出现的这个,哎报了,那你说这块呢,它到底是个错误啊,还是一个异常啊,我怎么去区分啊。哎,对,一般呢,其实咱们就看那个后缀就行是吧。哎,你看我们这个API啊,我点开这个error,哎,你看这块呢,就提到了它的一些具体的这个类了,基本上都是以error为后缀的。也有特别的像这个。啊,现成死亡是吧,诶基本上都是以error为后缀的,所以呢,你比较好辨别啊,回到这个lo下边我们再看一下这个exception啊。
17:07
哎,相对来说就比较丰富一些了,然后呢,你看基本上都是以exception是不是为后缀的。所以呢,只要你看到相应的是叫什么什么exception了,这个就属于叫异常,什么时候error了,那就是叫错误了。哎,所以比较好区分。OK啊好,那么针对这个exception的话呢,我们下边这块呢,其实针对它呢,又可以具体的去细分了。啊,这个细分为呢,叫编译时异常和运行时异常。怎么讲?说我们这个Java程序的运行的时候,我们第一天讲课就说过了啊,分成一个叫编译的环节和运行的一个环节。那如果说你在执行Java c.EE这个命令的时候呢,它就抛出来了一些异常了,我们就称为它叫编译式异常。如果呢,你是在执行这个,呃,已经正常的生成磁解码文件,我们通过java.ese这个指令去解释运行这个程序,这个时候出现的我们就称为它叫运行异常。
18:00
诶,所以很自然而然的啊,根据它在什么时期出现呢,就做了一个划分。这个编译式异常呢,也称为呢叫check的异常,Check的翻译呢叫做受检异常。啊,运行时异常呢,运行时就是runtime的意思啊,哎,叫runtime啊exception啊运行时异常,呃,也称为呢,相较上面这个,它叫做UN check了,叫非受检异常。啊,可能有同学觉得有点莫名其妙的哈,说怎么这个还受检,这叫非受检呢?啊,你可以这样理解啊,就是说呢,呃,运行时异常呢,它通常不是编译时候就不报错吗。相当于变异绳呢,就把它给放过去了,就是没有检查它。就非受检了,或者你想象他这个高速公路上不是有这个。检票口是吧,收收费站这样的,呃,运行时异常的话呢,它就是第一个口呢,你可以理解成叫编译时的环节,这个呢叫运行时的环节,它编译时候呢,是很顺利的就过来的,你可以理解成就是非受检的。你这样呢,去记一下就行啊,而这个变异式异常的话呢,他一上来这块呢,就给他检查了。
19:03
他就是受检的。那就这样啊,行。诶,那么这呢,就是我们说的这样两种具体的异常的情况啊,细节呢,我们就不用多去关注它了啊,然后下边这块呢,你看我列了这样的一个体系的一个关系图,主要呢,我们关心的其实就是这个exception了。好,那么回到我们这个API这个层面啊,那我们想看看这哪些是编译时异常,哪些是运行时异常啊,看着都有点懵是吧。哎,那我们这里边找一个东西,这个呢,就叫做,诶找到了。哎,就ion。它就是运行。这个啊,好。它就是运行时异常。除了他之外呢?都是编译式异常。啊,所以你从这个角度上可以说这个世界呢,分成两类人,第一类呢,是你自己。第二类呢,是其他人是吧。就这个哥们儿是运营是异常啊好,那你觉得他好像是好像感觉挺单薄的是吧?哎,那你是没点开。
20:03
是吧,都在这藏着呢哈,点开之后呢,这全是运行时异常。啊,那我们要讲这个课的话呢,咱们要一个个都讲了,那这个咱们也讲不完了,就是吧,因为有好多异常,你这辈子呢,你也见不着。啊,这样来看的话呢,就是写这些异常的这些人呢,还是挺辛苦的是吧?诶要考虑到各种各样的情况啊好,那对于我们来讲的话呢,咱们接下来要做个什么事儿啊,咱们现在要做的事儿呢,就是熟悉一下常见的这个运营试一厂都有哪些是吧?哎,常见的诶编译式一厂都有哪些,稍微的熟悉点就行,太多了我们也看不过来啊。行,那回到我们这个,诶笔记这个层面呢,咱们要做的事儿呢,就把这个体系结构啊,咱们稍微的捋一下啊,比较顶层的叫做。好,这个RO呢,就是我们整个啊,异常体系的一个服类。
21:00
诶直接呢提成1OBJECT的啊,然后它下边的话呢,有两个此类啊,一个呢是哎long包下的叫做error。啊,接着呢,再往下是吧。啊,跟它并列的话呢,是Java点。哎,浪漫下的有一个叫exception啊,然后把这个呢,我们称为呢叫做错误了。诶叫错误,然后它的特点是什么呢?诶刚才我们在上边这块也提到了,诶当然呢,把这段话呢,稍微的理解一下。诶Java虚拟机呢,发生的这种严重的问题,我们不编写针对性的代码进行处理啊,关键的就是这个不编写代码进行处理了,好然后具体呢,他这个例子呢,诶这呢,我在这也稍微的写两个啊。这个呢,我们刚才看到叫stack overflow。哎,这个。这是其中的一个啊,还有一个呢,叫auto memory的一个error。
22:00
这个呢,习惯上我们都叫做oom了啊。行,这块典型的我就列这两个了,那关于这个错误的话呢,咱们就收尾了啊,就不管它了啊,然后这个exception呢,我们称为呢,叫做异常,这呢也是我们这一章异常处理呢,针对的其实就是他,诶我们。可以。哎,编写哎针对性的代码啊进行处理。哎,就是它了啊好,那么这个exception的话呢,刚才我们又提到了它呢,下边又具体的去分。对,分成了两类啊,第一类呢,叫做编译时异常。哎,这个呢,就是我们在。诶,执行啊Java c.EE这个命令时。出现的一场。啊,这个也很好理解,然后接着我们再来说一下,对应的呢,叫运行时。呃,异常啊,这个呢,就是我们在执行。
23:03
哎,这个Java点啊ex这个命令时。对,出现了一场。哎,这有有这样的一个区别啊好,然后这个编译式一堂呢,刚才我们也看到他还有个名,就这呢,就是大家在平时比如看一些书啊,或者一些帖子啊,哎,这个时候呢,他可能也会用这个词了啊,哎把它呢也称为呢,叫做寿检异常是吧。诶它呢称为叫受检异常,就是check异常,这个呢称为那叫非受检异常是吧。你看这样啊。呃,其实这块呢,你要说受检异常,非受检异常呢,呃,严格来说呢,还稍微的把艾若这块也有一个,诶这个划归啊,你看这个蓝色的叫非受检异常,就是主要的就是我们运营式异常了。诶,其实呢,还包了一个艾。啊,为啥呢,因为A呢,你看大家也发现了,我们刚才测试的时候呢,刚才在这个,诶编译的时候,你看其实也没出现是吧。诶,所以就把它呢,顺带的也给大家归到这个非受检里边了啊,这个稍微了解就行啊,这个呢不是重点的内容,好,那么下边呢,刚才我们提到要熟悉的点呢,就在于常见的编译式异常和运营式异常呢,都有哪些是吧,这个是我们目前呢比较感兴趣的啊,这个其实也在我们这个里边啊,有这样的一个问题的啊。
24:18
常见的异常都有哪些呢?啊,如果呢,大家是开发一两年的啊,这块呢,我们要说的是有哪一些开发三年以上的,我们要说的是有哪些,这个呢是有区别的。啊,区别就在于说你要说的三年以上,说的太简单的不是显得太low吗?啊,你要是刚毕业的时候,你要说的太高级的话呢,让你举例,你不是你也举不出来嘛。诶行,那具体有哪些,咱们先来说一下,诶常见的运营式异常。啊,这块呢,我们可以呢,就具体的可以来列一列了,啊这个大家呢,现在回忆回忆,我们都出现过哪些呢。啊,速度PPT是吧,A death out of boce。
25:00
Exception。还有吗?好控制异常啊。啊,这个我们叫now。Hunter。是吧,还有吗?好,Class exception。哎,挺好的啊,还有吗?对,我们讲这个包装类的时候啊,For me。啊,Exception是吧。啊,其实也差不多了啊,大家说的呃,我们在这个相应的其他一些场景当中,比如说我们an要求你输入一个in值,你写了一个ABC,这个呢叫呃,Miss match。啊,这个。哎,这样Miss match啊。Match exception。啊,就是输入的这个类型不一致的这样一个异常啊,还有呢,我们这叫算术异常A。Magic啊,Exception啊等等啊,其实挺多的啊,那这呢,我们列了这么多,那你能举例子吗?
26:07
是吧,像我们刚才写的这些呢,这都属于开发一到两年,大家可以去说的一些异常的情况了啊,那说到这儿呢,咱们就这块儿呢,去举举这个例子呗。哎,刚才呢,我们列了有这样的一些啊。哎,像这个呢,就是谁列的谁得负责了是吧。哎,就相当于呢,在笔试当中,如果你说哎有控制人异常说举个例子,就是那卡了半天说举不出来。这有点尴尬啊,好,一个个来吧,第一个,哎,速度角VD比较简单啊。哎,长度的是十。哎,有效的角标范围就零到九是吧。这个。对,你就写个十就行。啊,这个呢,就是一个小标越界哈。嗯,这个index auto。哎,后边的写的很清楚啊,长度是十,你写这个index是事实。哎,这是他的这个问题啊。
27:03
这是第一个啊,不多说了,好第二个。我这还用这个单元测试方法了。哎,空指针异常,这个情况呢,其实相当多啊。我们讲数组的时候呢,其实举过啊,那么在我们这个面向对象里边呢,这是最典型的一个异常的情况了。比如说这块呢,HR。啊,这张写个hello是吧。哎,然后这个h2.2,我们就简单调two吧。哎,像这个的话呢,这都没问题。啊,运行一下。那这都是靠谱的啊,但关键的就是你现在呢,这个具体的呃,指针的指向呢,是一个空的是吧。哎,这就控制人了。哎,这不就控制帧。哎,这样的问题啊。呃,我们在讲数组的时候呢,这种情况呢,其实也都出现过,稍微的,我们举个例子,哎,数组想想。诶,我要是基于这样场景写的话呢,你想调,比如说AR给我写个零,这都没问题是吧,但问题呢,就是你AR呢,你给支撑个闹了是吧。
28:04
哎,这个呢,就也是一个空的指针。你看也是控制针啊。当时呢,我们还讲过这个二维数组。回一下啊,哎,我就还以他为例。然后这呢,我写个十,这个没写是吧。然后这是我们去打一下A210。零是不是这样?哎,这呢也是一个控制针。啊也是控制人好,这个呢,我们就来说到这儿啊,这叫控制人的异常,这个呢,其实你都随便举,尤其是面向对象这块啊,只要呢,对象呢,指向的没有实体,你想调个方法,调个属性,哎,都是算控制帧了啊。啊,第三个这个呢,叫class exception这个怎么。哎,随便写两个啥。写两类哈,那我用现成的吧,比如我用一个string,把它呢付给了object。这可以是吧,然后呢,这个obj的话呢,你要是强转的话呢,是可以转成死盾的。
29:02
啊,这呢,我们alt回车一下,这个呢是不会出现强转异常的问题的。啊,这是正常的,本来你就是个字符串啊,但现在的话呢,你是把它做了一个强转,转成了别的类型啊,比如说日期的date类型。那这个date呢,我们指明一下啊。是这个,比如U队下的吧。这么着啊好,那这块呢,我们编译的话呢,不报错啊,因为语法上呢,这都是满足的,但实际上你去转换的时候呢,它不是一个string,这不就报了吗。哎,Class exception OK啊。这是我们说的这个第三个,再一个呢叫exception。哎,这个想想怎么举。比如说我这有一个字符串,我这呢叫123是吧。我把它转换成一个int类型。这是没问题的啊,In,这点我们pass一下atr往那一扔啊,一回车这不A就出来了吗?
30:04
哎,打印一下这个I啊,它就是123。啊,没问题好,那问题呢,就是你现在这个HR呢,写成个ABC了。啊,这个呢,就没有办法转换了。哎,就出现这个问题啊的exception啊。好,我这一边写呢,大家一边记哈,啊,因为呢,不是说这也是一个笔试题嘛。OK,下面呢,Input misma的exception。对,这样我们就拿这个scanner来去说明了。啊,比如这块,我们先把这个scanner呢,先给大家造出来。可以了啊好,直接拿这个SKY呢,我们去调一个next int这个方法,想获取一个int类型的一个值,把这个值呢,我们就打印一下了。这块我们也没写提示啊,哎,我就直接拿去run了。啊,回过来这时候呢,等着我去输入呢,我就写了个十啊一回车我就把这个十呢给打印了。
31:03
就在这啊,哎,但是现在呢,我们在运行的时候呢,用户呢,非得写个ABC。那就出现了一个这样input mismatch exception。哎,就是他需要的这个类型,跟我们填入的类型呢,不匹配啊。啊,Input mismatch exception。那就他啊好,下边这个呢,叫算术的一个异常。对,在我们数学运算当中呢,其实有一些潜在的要求。那你比如说我们这个分母不能为零,对吧?哎,这个呢,就是一个要求了啊,所以这块呢,这个number呢,这个是十,直接呢,就让这个number呢,去除以一个零。哎,在编译的时候呢,没有报错啊,这个不是这个错啊,是我们上面运行的时候这块的问题,它显示的啊,这个呢是没问题的啊,运行的时候呢,它真正拿这个number去除以这个零的时候,发现呢,根本没法除啊,所以呢,他就会报一个叫算术异常。Arithme exception这个呢,原因呢,是因为你除零了。
32:00
哎,就这个意思啊。好,这个我们就把它粘过来,OK,这呢我就列举出来了啊,算是有六个啊,运行时异常。这个大家的话呢,如果呢,诶这个你去面试当中遇到这个问题了啊,该怎么答呢?诶像你刚毕业的话呢,就是把这几个呢,稍微的说一说,这都行。啊,这都行啊,诶推荐呢,大家呢,先说运行时异常,因为呢,他们呢,我们在开发当中其实比较常见哈,所以呢,很自然而然的你会先想到它。那这叫运营式异常,那编译式异常呢,咱们也稍微的给大家去举举这个例子啊。变异是异常,我们可以取几个,比如说。嗯,Class。哎,这里边儿有一些场景咱们就没见过了啊,叫not found。为啥没见过呢?因为我们之前呢,要见到了,这不就自己给自己找麻烦吗?啊,前面你说遇到了,然后边译还过不了,还得处理处理呢,还没讲,所以前面我们都避开这样的问题了。现在呢,我们得直面这些问题啊,第一个呢,叫class not found exception,翻译过来呢,叫做。
33:04
类找不到的一场是吧。OK啊,然后还有。对,比如说我们这个叫not found。Exception文件找不到的这样的一个异常,还有呢,我们比如说来一个叫IO的。Exception这个I呢就不熟了。啊,就是I呢,Input or output,输入输出的一个异常,就是我们跟本地的文件呢,进行这个数据传输的时候呢,出现的啊好,那我这儿呢,就以这三个为例呢,咱们给大家去说一说。诶回过来啊,然后这块的话,我们拉一条线。哎,那么我们这儿呢,写一下啊说呢以上是运行时异常。啊,以下。是编译,是一场。就这样啊好,下边我们来去举这个例子了,哎,首先单元测试方法七啊。先来一个叫class not found exception这块呢,我们可以通过后边要讲了一个反射的一个内容啊,叫class.for这块呢,我们主动的去加载一下这个浪包下的这个string。
34:09
就他啊,然后把它加载过来以后的话呢,这块呢,它就会有一个具体的一个。Class。哎,我就这样起个名就行了啊好,那么这时候的话你会发现,诶,这怎么报错了呢?这不就是咱们所说的叫编译式异常吗。诶就是在编译的时候呢,它这块就报红线就过不去了,诶你把光标这是咱们上面运行的时候的情况啊。在这儿啊,在这儿啊,你看这块呢,它会写着说你按handle的exception说没有呢,处理的handle就处理的意思,没有处理异常谁呀,Class not found exception。比如这个代码呢,如果大家你写到一个文件里边,用命令行去编译的话呢,直接就挂掉了。上面这些呢,都是编译美食运行时候才挂掉的啊,哎,这个呢,就是我们说的叫编译时异常。那要想这个通过呢,目前咱们只能考虑把它先注释掉啊。
35:01
哎,这个呢,就是一个叫class not found啊。哎,这是一个,然后呢下这两个叫到一。好,这块呢,我来写一个具体的例子啊,这个例子的话呢,我们这么着来,诶首先的话呢,我们先有一个file,哎,我去new一个file,这个呢,不妨我就写一个,比如叫hello点哎,Tit吧,哎,这呢是一个文件了啊,然后呢,我们通过一个file input stream。啊,这块呢,大家还不熟啊,你就看看热闹就行了啊。这呢,实际上我们后边要讲的一个流啊,这个流呢,它直接呢来操作这个文件,我要干什么事儿呢,我要把这个文件中的内容啊,读到咱们内存当中输出一下。啊,就是这样的一个需求。好,那么这个需求的话呢,我们直接呢,先通过他呢去read啊,先调一次啊这呢我们先拿到一个data的数据。
36:03
啊,然后呢,我们去做一个while的判断啊,看这个呢,它是否呢,不等于负一。啊,这为什么是负一啊?咱就先写啊,先不用想那么多,这个呢就不要换行了,这呢我们把这个data拿过来,这呢我们就写个差,要不它是个int类型的啊,诶接下来的话呢,我们再让这个data呢再读一次。哎,这么着啊行,那依次走走走走走,直到呢,你这个data呢,是负一的时候呢,就退出了,退出呢就意味着就读完了,哎,所以说呢,就是什么时候到负一呢,就这个文件呢读完了,读完的时候呢,最后会返回一个负一啊。好,那读完以后的话呢,我们可以呢,这里边儿就涉及到了以后,我们也要讲一个问题,就是资源关闭的问题,类似于scanner啊这个理由的话呢,我们需要呢,Close一下。哎,那么整个这个程序呢,就结束了。好,这个代码呢,我就先写出来,大家不用去细究里边的逻辑,我们主要呢,来看一看,这里边儿会有几个位置呢,报这个红线了啊,那这个红线的话呢,第一个位置呢。哎,第一个这个位置呢,其实对应的就是这块了。
37:02
这块看一下啊,诶说呢,这块有一个叫诶,File not found exception。文件找不到,就是相当于呢,你上面呢,写了一个字符串,以这个字符串为代表的,你表示的是一个地址了。是吧,说你这地址你靠谱吗?写对吗。啊,有可能不对呀,诶,所以这块他又报了一个说文件找不到的一个异常。哎,那么问一下哈,你说这个文件是真的找不到吗。哎,不一定是不是只能说叫可能啊。就跟说呢,大家呢,你说出门了,出门呃怎么办呢,说可能会下雨。就是它有这种可能性啊,所以这块呢,就是你可能这个文件呢找不到,所以它这块就给我们出来了啊,然后下边这个read的话呢,就是这个文件中的内容了,那读的时候呢,这个read的方法对应的呢,叫做IO的exception。说你可能呢,会出现一个IO的一个,比如说这个,呃,数据通道呢,拥堵了,堵塞了啊,这就堵不到了。诶,然后呢,这还是这个read,所以他这也报了,然后最后这个关闭的时候呢,我们要结束这样的一个通道了,结束的时候呢,有可能也不通畅。
38:06
啊,没有顺利的关闭掉,所以呢,也报了一个IO的exception。所以在这里边儿呢,我们看到了,在这个位置呢,它会。哎,这个叫fair not found是吧。Exception。然后这块。这个呢是报这个叫IO是吧。Exception。哎,下边呢,也都是啊,但是这块我得加上一个叫可能是吧。哎,大家呢,去体会一下这个事儿啊。OK。好,这个呢,就是我们说出现的这个叫编译时异常。啊,编译是异常啊,那么这个可能这块呢,怎么去理解呢?呃,既然咱们这个程序也写了,让大家稍微的就感受一下是吧,就是这个程序呢,它确实是可以运行的哈,但是目前的话呢,它有这个错误的信息。呃,或者说呢,这个错误信息我们解决之前呢,先这么着啊,这呢有个文件是吧。
39:00
这个文件的话呢,我写的是一个。啊,其实是一个相对路径了。啊,相对路径就是这块,你到底是在哪,是不是也看不出来是吧。嗯,不妨,咱们就先这么着吧。我在这个地盘下。哎,这呢,我们就哎随便来一个,我就叫做hello。哎,就它是吧,好在这儿呢,你把它打开,打开以后呢,在这儿呢,咱们写一个叫。嗯,你好,世界吧。啊,实际就他啊啊保存一下。世界杯啊,嗯。这个写完了,写完了,注意我们现在想把这个内容给大家读到我们这个程序当中,呃,稍微的留一点,就是我们这块呢,把它改一下这个字符集吧。啊,这个呢,改成U8是吧。那因为呢,咱们这个idea呢,都用的U8嘛。啊,这个我就写到这儿了啊,然后这个文件的话呢,我写成是一个绝对路径了。哎,那我们这块呢,就得是地盘下的这样写的啊。
40:00
诶大家会发现,诶这怎么两条线哈,因为一条线的时候呢,会报错。哈哈。对,因为呢,你这个杠什么,这是不是有可能就是转移了啊,所以呢,我们就得不让它表示的这个是转移的意思了,你就再加个杠。哎,这就可以了呗。或者呢,你说这块呢,还可以怎么着,你就这个斜杠反斜杠是吧。这样也行啊,这都是小细节了,好以后我们会讲啊,这呢,我们就把这个文件的内容呢给他诶读进来,那这时候你肯定是能找到他的啊。呃,然后这块呢,你看还是报啊,这个报的话呢,我们得先提前预知一下这个处理的事儿了,我就直接呢在这块先让大家感受一下啊。哎,我这个时候就死肉死出去,然后呢,叫IO的exception把你可能会的这异常呢,我们通过这样的方式呢给处理了,这也是咱们要讲的这个内容。啊,暂且呢,大家就先感受一下啊,诶他这块你看明显就不报了。补报以后的话呢,我去做一个run。诶,大家会发现,诶这块出问题了是吧。这块出问题的原因是什么呢?
41:02
因为我写的是汉字。因为这没有刚才说U8的问题了,是,但是呢,我们一个汉字的话呢,其实会占多个。这个字节我这儿呢,是一个字节一个字节读的。啊,咱们讲到IO流的时候呢,专门会去解决这个问题。啊,这我相当于自己给自己刚才埋了一个坑是吧?哎,现在让大家看到了这个不该看到的东西了,咱们还老实一点吧,Hello一下是吧。Hello,这个word是吧。诶,咱们讲到这个这个L流的时候呢,诶就专门得解决这个问题哈,这还是非常重要的一个问题,暂且的话呢,我就先不说了,因为说多了咱们重点就偏了哈,咱们现在是讲异常处理的,不是讲IO流的啊。好,我先写成这个英文,然后我们再去run一下。这不就没事了吗?对,大家你注意看啊,现在的话呢,我们是把这个异常处理了,那你说我们这个程序在执行过程当中出现异常了吗。
42:02
是没出现还是说出现了给处理了。就跟说你现在很健康,你是就没生病,还是你生了病又好了呢?怎么着呢?注意是没出现啊。是没出现,你看我们这个文件实打实的在啊。你说你这个可能会报啊,文件找不到异常,我这真的是在呢,所以就没有报。然后呢,他在这个读写的时候呢,其实也没有什么问题,也读成了,也打印出来了,最后呢,也顺利的关闭掉了。所以这个整个过程当中啊,其实是没有出现的。那有同学就跟他讲说那没有出现,那这块那还处理啥呢。那不行,不处理呢,编译不让过。啊,也就是说这个程序的话呢,虽然我们知道呢,妥妥的是就是没问题的,但是那也得去处理,就跟说呢,你现在要出门了。出门的话呢,就说,哎,告诉你说可能会下雨,你说呢。
43:01
下雨就下雨,但是也可能不下。不下就没事儿,你说那我就出去吧,不行,出门之前呢,你必须要想好,万一要下雨怎么办。啊,你说我带上一把伞是吧,但是你带上伞出去之后呢,实际情况呢,就没有下,没有下就没有下。啊,就跟我们这儿一样啊,说这个程序呢,你接着想去,呃编译想去运行,那不好意思,编译之前呢,我就不让你过啊,我就告诉你说可能会报这样的一场,你说这我这这没问题,不下雨不下雨也不行,必须要处理。诶,我们就用刚才这种方式呢,相当于给处理了一下,但处理完以后就相当于说我带上伞了啊行,那带上伞那就走吧,结果呢,真正运营的时候呢,发现根本也没下雨。没下雨就没下了,那万一要下呢,万一要下就按照这种方式去处理。啊对,就这个意思啊,就是相当于呢,我们不能老想着说万一怎么着是吧,就是你把处理的方式啊,你得提前先想好,出现了就按这个方式处理,没出现没出现是最好的。
44:00
哎,就是这个意思啊好,那咱这呢,就暂时就先不处理了,为了让这个程序呢,就显着。是吧,不要报这个红了,咱们就把它注释一下了。好,那么通过刚才这样的一个演示呢,咱们就说了一下常见的这些异常都有哪些了,哎,我这儿呢,就在这儿呢写了一下,然后这一块我们目前列的这些,如果呢,作为一道面试题来讲的话呢,大家呢,适合写到这个位置啊。也就一两年的这个为止。不能再往后了。啊,那么你要是开发三年以上了,说你常见的异常都有哪些,这时候该说什么呀?哎,这时候呢,说没出现过是吗。肯定不合适啊,哎,这时候应该说什么呀?哎,其实呢,咱们现在说你出现过哪些异常,似乎呢说的都是exception是吧。但其实呢,我们平时说的说,哎呀我又出异常了啊,又出现bug了,我们可能异常跟bug都混着用了。是吧,哎,那这异常的话呢,自然而然的把这个L呢,有时候也就混着说了。
45:02
所以说三年以上啊,你这块应该说什么问题呢,应该说。这两个,但是这两个里边这个呢,有点太low了。啊,应该说OM。所以呢,诶,你开发的时候出现过什么异常,你问我出现过OM好,那下边呢,你能说一下在哪些场景下出现过OM吗?是OM好说,关键就是你什么时候出现过,注意这时候再举例的话呢。这个就别举了吧,这个是不是有点low是吧?诶,那你就得举具体你在什么样场景下,就我们这个项目是怎么着,诶我们一开始上线的时候都没有问题,后来的时候呢,这个系系统呢,就运行的就特别慢了,然后查看日志的话呢,发现呢,诶可能频繁的进行一些for,导致我们这个程序呢,就总是呢叫stop the了。暂停嘛是吧,啊暂停的话呢,用户线程不就停下来嘛,就导致用户感觉就比较卡,诶所以这块呢,通过这个追踪发现呢,存在一些内存的泄露。
46:00
啊,甚至说呢,你说在呃找问题的过程当中,结果呢,整个系统线上系统就挂掉了,挂掉的原因呢,就是出现了一个OM了,就是因为呢,最后一查有很多的泄漏问题,这个泄露呢,最终导致呢,这个堆呢给溢出了,然后最后你又找说是因为什么样的原因,你这你们这块呢给泄露了,然后你把这个问题给改掉了,哎,就没有出现OM了,然后整个系统呢,几个月之后呢,它也正常的诶。体验也还挺好,没有出现这种卡顿的情况。那整个这一套下来之后呢,其实就是解决了一个OM是吧,但整个这个解决的过程呢,其实就体现了你的这个经验。而且呢,这个OM呢,也不光是报这个堆意图,它有很多的这个情况啊,这冒号是冒号,后边还有很多种别的情况。啊,那这块呢,其实你可以再举几个高级的,哎,这不就显得你的经验比较多了嘛,那咱们这块呢,刚开始,所以咱就。略掉了。啊,以后的话呢,大家比如说后台开发的话呢,涉及到的线上系统的一个监控啊,调优啊,啊就需要学GM了,就需要面对这个问题。啊,那就以后再说啊,暂且先把这几个事儿弄熟。
我来说两句