00:00
好了,那么接下来呢,我们继续看各位啊,继续看看什么呢?就说我们这个自定义的异常在哪用,就是我们会自定义对吧,我们怎么去用它呢?是不是我们怎么去用这个自定义的异常。来我们我们看一下啊,看一下各位,我们来改善一下我们之前所写的一个程序,我们之前在哪个地方写过一个数组模拟站,大家还记得吗?数组模拟战是在第19章吧?我记得好像写过一个数组模拟战。找找homework里边的有一个my back是不是?是这个呀。哎,我们把这个拿过来啊,过来之后放哪呢?放到我们这个地方。各位啊。放到我们这个地方,我复制了已经啊复制了复制了之后呢,我把这21打开。打开之后呢,我把这个站放到这里。贴过来叫back。好,大家看这是我们那个程序对吧。
01:00
这个程序还认识吗?这是不是一个站啊。哎,这是不是一个数组啊,这是不是战争,这是无参构造吧。对不对,这是铺置方法,是不是往里面站加加东西啊,这是不是弹占啊,还记得吗?哎,记得就行啊记得就行,好了各位,那我你占满了算不算异常。占满了算不算异常,各位?思考一下。占满了是不是算异常,以前我们是把这个异常信息打印出来,然后return结束是不是?你不觉得这种方式有点low吗?是吧?我们的目的是终止程序,然后把信息怎么着传递出去?战压,战失败,战已满或这是什么呀?这叫谈战失败,战已空,像这种情况其实都属于异常现象,我们可以把它看成是异常,比如说你战压满了,那我就就就抛异常呗。对吧,抛异常我们试一下啊,试一下各位在这里我们自定义一个异常各位啊,注意听啊,我改代码了啊,改了啊看啊。
02:04
Class叫做MYCK,叫做operation operation这个单词能看懂吗?自自定义异常嘛,叫stack操作异常,叫站操作异常。占操作异常。总结一下啊,自定义的啊,这个叫占操作异常两步继承exception是不是写俩构造方法对吗?一个无参的构造是不是好,那我问你是不是一个有参数的构造方法。对吧,哎,有参数的。好了,那这样的话,我们无参构造,有参构造就写完了,那这个异常类呢,我们也定义完了,非常之简单两步是吧,占操作异常,自定义异常啊,那么接下来在我们程序当中,我们想终止这个程序以后我们就再也不用这样写了。我们不用这样写了,各位啊。
03:02
你想终止程序,你可以抛异常让他终止。明白吗?战衣嘛,你可以抛异常啊。对不对这个代码进行改进了,各位啊,我待会儿没了啊,删了。删了之后,如果说index大于这个的话,那压战就失败了,压战失败,压战失败的话,你就拗一个异常出来呗,你把异常扭出来看好了啊,来到了关键时刻了啊,异常E等于谬一个什么呀,它然后写上什么呀,叫占什么已满。失败。占已满,嗯,可以吧,哎,这叫创建什么异常对象,然后手动将异常抛出去。怎么抛throw啊?讲到一个关键,Throw就完事了。啊,各位。好,大家分析一下这个地方为什么报错。为什么报错?
04:06
为什么报错呀?这个是一个。对吧,这个异常是不是继承exception,所以这个异常是编译时异常,对吗?对不对啊。是不是啊,同学们是不是编译时异常?编译时异常要求程序员的编写段必须要进行处理吧?要么在TRY开好,我问你,你是要选择TRY开有意义吗?你自己抛一个,扭一个异常,然后往外抛,结果自己抓有意思吗?是不是没意思啊?对吧,所以你这边应该选哪个呀。是不是啊?理解我说的意思吗?各位。就是为什么这报错呀。为什么这报错?
05:00
是因为这个异常,是不是一个编译时异常。编译实验要求程序员在编写阶段必须对这个异常进行处理,要么在这try catch,要么THROW2个选一个你自己拗,一个自己往外扔。扔才对,你自己自己在这扭了一个自己装没有意义啊,你所以在这TRYK是没有意义的,你不要去捕捉。对不对,不要去捕捉各位啊,不要去捕捉。你这样应该是往外抛。就往外抛就行了,占已满这个事儿是不是得让调用者知道啊?大家思考一下,这里捕捉是不是没有意义啊,这里捕捉没有意义。自己拗,一个异常自己抓。自己。自己说没有意义,明白吧,占已满这个信息你需要传递出去,明白吗?占已满这个信息你需要传递出去,需要把这个信息扔出去,扔到外边。
06:01
明白什么意思吗?所以在这我们执行怎么着啊,哎啊,要不然你编译过不去来,这两行代码能不能合并成一行,各位合并一下怎么写?合并怎么写new?是不就行了。因为这个异常对象扭出来之后你啊。对吧,这就是手动抛异常啊,手动抛出异常,就如果说这个条件一旦成立,我认为占满了就抛异常,我问大家抛异常是不是可以终止程序。是不是再往下这个程序就不执行了。对不对啊。而且他还可以把这异常信息是不是传出去啊。是不是顶我们刚才那一行代码那个return代码了。最初是改良之前是怎样的?改良之前?各位思考一下改良之前怎么做的?是不是在这输出一句话呀,土不土啊啊说出一句话叫什么压占10万占已满吧。
07:08
是不是?然后嘎,来个return,你看这代码多low,现在变了,我如果这行代码出现的话,既可以代替return。终止程序又可以把这个信息传出去,你在这个信息是不是只能在你push这个方法里边去输出这个信息,我这个异常就不一样了,我这个异常它可以往上扔啊,谁调我我这个异常信息可以给他。所以我这个代码的高端程度要比你这个高端很多,以后我们统一像这种代码就不这样写了,我们统一都用异常的方式去处理。这样就衔接上了,大家好好看看这个file input stream,我们今天用了一天了,你打开这个类file input stream,对吧,你找找这里边是不是有构导方法,我们看看构造方法来,就这个构造方法好,你能看懂了吗?这次。这次你看懂了吗?这个构造方法file input stream,是不是抛这个,这个非not found exception,那是因为什么?因为这个地方是不是有个异常。
08:06
是吧,Throw嘛,用啊去new一个异常抛出,这叫手动抛异常,那么这异常你在这捕捉肯定不行,所以它采用这throws嘛。这一下是不是就打通了,打通任督二脉了,是不是所有的知识点是不是就全部连起来了?各位你好好想想。对吧,那这块他为什么在这写个词啊,因为这个异常是一个编译是异常。对吧?哎,编译识异常,你必须对它进行处理,要么在这Rose,要么揣开始,你想想你在这揣开始没有用啊,你自己捕捉这个拗,这个异常抛出去,你自己在这抓住是没有意义,所以这块采用是往外抛。好,那同样我们这个程序也是一样的,我们这个my stack这块push对吧,那这块呢,是一个异常去继承except人中自定义的异常嘛,然后在这里出现这个问题之后,我们就可以拗一个异常给它抛出去压占失败占一满,那同样道理,占一空呢,占一空我们这大们也不需要这样写,也不需要这样写了,直接在这儿throw,你有一个什么呀,My sta operation exception,然后接下来把这块呢,叫做谈战失败战已空,诶填进去,那这样的话,这个地方你要么在这try catch,大家知道try catch没有意义,因为你手动跑,那么这块我们就是。
09:19
在方法声明的位置上抛就行了。大家看见了吧,以后的这个异常在实际开发中就是这样用的。就是这样用的,改造了一下这个程序,各位啊,那改造完之后呢,接下来我们在我们的程序当中应该怎么用呢?来我们尝试一下啊,现在呢,这个程序已经到15了,是不是我们来一个。来一个16。Class,我们叫什么呀?叫exception,叫TEST16。这是一个完美的程序,各位啊,完美的程序来这边我就关掉了啊,这个是我写的站,这个是我自定义的异常类,然后呢,这个测试程序,我来测一下测试改良之后的站啊,测试改良之后的stack stack。
10:09
好,那么这块首先第一个我们要创建什么呀?站对象怎么创建my stack。Stack是不是你有一个什么呀,My stack你完之后呢,接下来对吧,压战。对不对,然后谈战是不是,哎压站弹战,那么压榨的Sta.push我们压一个什么进去,你有一个object吧,行吧,哎压进去一个好,大家看编译是不是报错了。是不是报错了,各位编译为什么报错?因为你这个方法是不是有可能会出现这个异常。而这个异常是不是继承编译是异常,所以你在这里调这个push方法,是不是必须对这个异常进行处理,你在这try catch还是在这throw,各位告诉我。你选哪个这个位置报错了,对,因为这个方法有异常啊,这个方法有可能会出异常,那么这个方法是个编译是异常,你在这TRY开,要么在throw你throw还是还是还是还是捕捉。
11:08
你在这往上抛,再抛闷方法抛给谁了,Java虚拟机程序是不是就终止了,所以你在这块怎么做呀。怎么做呀,各位哎,捕捉捕捉啊,来一个两个三个四个五个六个七个八个九个十个11,大家看这个前十个没问题,再往第11个,这是不是就出异常了。对吧,这里占就满了吧,占满了对吧,那你可以打印异常对战信息,那我问大家,我能不能在捕捉到这个异常之后,我能不能输出异常的消息啊。能不能输出异常的消息。各位。就我不打印异常对战信息,我输出异常的简单信息可以吗?输出异常的简单信息可以吗?各位,现在我们在这new这个异常的时候,你有没有往里边传简单信息,你new这个异常的时候,是不是往这传一个双引号里边传了一个站压站失败占已满对不对?那么这个字符串传进去之后,那么将来在这个地方调异常对象的get message方法能不能获取到那个构造方法里边参数?
12:12
我们之前讲没讲各位讲没讲各位,你之前在这儿是不是new了个异常,把简单信息传进去了,在这块是不是调异常对象的get message方法就可以拿到那个简单的描述信息啊,异常简单描述信息就是他当时构造方法构造的时候传进去的这个信息吗?是不是那弹战呢,弹战那就stack点什么呀,Pop弹弹一次,你看弹也需要干啥呀,处理异常,那TRY开始就行了啊弹一次两次,三次四次五次六次,七次八次,九次,十次11次,来这块就是谈战什么呀,谈战失败了。那我们来看看这个程序吧,来执行一下走。好,大家看。
13:00
来,我这应该是说出一句话。来点get message啊,这样做。来,走。好,我们来看一看啊,一二三四五六七八九十到这儿是不是第十一十一没进去,没进去压战失败了,这个压站失败站已满是谁输出的,是因为你这个地方在压站的时候出现了异常,然后我这里捕捉异常之后我输出的信息。你下面同样一样谈战团战团战团战到这个位置上怎么着啊,谈战失败了,明白吗?哎,谈战失败了。谈战失败了,进到catch域块中执行输出异常的信息,大家看是不是就是这句话呀?对吧,哎,这个就是异常在实际开发中的一个应用啊,今天讲了一天,最后这一个是重点各位啊。今天讲了一天,最后这一个是重点,你只要把最后这一个重点掌握了就行了,什么重点?第一自定义异常类怎么自定义?写一个类继承exception,然后写俩构造方法,一个无餐,一个有餐,然后在你以后的程序里边,凡是出现异常的地方,你都可以采用new的方式手动抛异常。
14:09
你明白吗?明白吗?抛异常,然后在你的程序当中捕捉异常去处理啊,处理这个东西以后的写法是这样的,各位啊,不再用你的老土办法return了啊,啥啥啥不行就return,啥啥啥就不行return,现在是啥啥啥不行就抛异常。你明白吗?哎,养成这种风格,这种编程的一种风格,各位啊,这种编码的风格啊,最后这个例子,我们今天最重要的例子啊,注意。最后这个例子啊,是异常最重要的案例,必须掌握啊。自定义异常在实际开发中的应用。明白吧,它的应用啊,这是很重要的,就是基础语法,我们讲了半天了,是不是你也知道拆开你也知道RO了,对不对,哎,你也都知道了,那这块怎么用呢?哎,你看我们在实际开发商就是这样用。
15:06
就是这样用的啊,到时候我今天布置一个作业啊,你呢,今天把这个作业呢,哎,做一做啊做一做做一做各位啊行,那这样的话,咱们这块啊,手动抛异常我们就呃,自定义异常,包括手动抛异常,我们就说完了啊说完了。
我来说两句