00:01
好了同学们,那咱们就开始上课了,我们来看一下我们这个昨天这个布置的作业啊,昨天布置的作业。呃,这个作业呢,咱们打开一下看一眼啊。嗯,那么这个程序啊,是呃,是模拟一下我们的异常的一个使用,是不是,那这块呢,我看了一下,大家做的都非常不错啊,非常不错,呃,那这块的话,咱们来一起做一下好吧,一起做一下啊。来一块看一下啊。把这作业题咱们处理一下异常这块的啊,一个比较综合的一个案例。来咱们看一眼,嗯,还是在这个TA22第二章,第22章是我新建的一个这个模块啊,然后咱们看一下这个。嗯,这个作业的话,我就在这儿直接建一个package吧,好吧。Package叫homework。然后呢,这块呢,我们就直接去新建一个类,这个类呢,我们说叫user service是不是啊user service。
01:03
这个类呢,是一个什么呀?是一个用户的什么,哎业务类是不是,哎用户业务类,那处理用户相关的业务吧,哎,处理用户相关的业务啊,例如什么呢?例如这个登录啊。注册呀,是不是啊登录啊注册啊等信息吧,啊等功能吧,啊等功能啊,那么这块呢,我们提供一个注册的这样一个方法啊,提供注册这样一个方法啊,Public,然后void register。这个方法你可以用静态的啊,你可以用静态的,也可以用实例方法都行,现在还确定不了这个方法,到底用静态的方法还是实例方法,确定不下来啊,等后期的时候,我们在呃做到后边项目的时候你就知道啊,这个方法呀,它不能加static啊,不能加static,但现在的话你加不加都行,无所谓啊,来注册,那注册提供用户名和什么呀,和这个密码。
02:01
是不是哎提供用户名和密码,那么就提供两个参数,这个方法你也可以返回布尔类型对不对,说注册成功之后,返回处注册失败返回false,是不是我在这儿呢,就不返回了啊。那注册这这是一个注册的方法呗,是不是,那咱们这块呢,有一个有一个什么呀,有一个异常。对不对,就是说你如如果输入的用户名这一块对吧?呃,不是在六到14之间的,那我认为你这个就不行啊,我认为是一种异常,那这个时候呢,我们可以自定义异常是不是,那我们在homework下面新建一个什么呀?Class,这个class叫illegal。无效阿。啊,无效。嗯。缩写吧,参数异常。无效参数异常啊,或者无效名字异常都行,你说无效name。是不是哎无效异常,那么这个类呢,去继承谁呀?Exception对吧?哎继承exception啊。
03:05
或者说你愿意继承runtime exam也行,没有那么清晰的界限,各位啊。继成runtime也行,继成except也可以,继承runtime就是运行也继成except,就是编译是异常啊,然后接下来呢,我们提供两个构造方法,假如说呢,我们在这里提供一个无参数的构造方法。然后再提供一个有参数的构造方法。昨天有同学就写成这样了,对吧,你没看我这里还多了一个东西叫super是吧,叫super吗?是不是你没有这个那就废了啊,没有这个,那你这个实际上这个对象在构造的时候,你这个信息没有传过去。你构造方法这块传的这个信息,将来我们之所以可以调异常的get message这个方法,把异常的信息之所以可以拿到,是因为你在这块。传过去了,其实我们可以看一下源代码,好吧,今天让你豁然开朗一下啊,来点一下super,大家看啊,Super就是它呗,Super的构造方法对不对?Super是不是又叫super啊?
04:05
这个消息是不是往下传了?构造方法的参数是不往下传了?好好,这个throw,大家看这个message是不是付给了detail message。这构造方法上的这个消息是不是最终付给了个detail message?如果在idea工具里面发紫色啊,这是紫色吧,如果发紫色,记住了啊,在idea里面发,但凡是发紫色的就表示实例变量。你可以点过去看看他这个把这个message付给谁了,这个实例变量了。这是个实例变量,各位大家看见没有,哎,那正好叫detail message,那么这里面有一个方法,各位。大家看叫什么叫get message方法,我们可以点过去,你看这个get message方法是不是正好返回的是detail message啊。所以呢,你这个构造方法实际上在调用的时候呢,你把这个消息呢,传给了副类,副类这边把消息又传给了副类,副类呢把消息怎么着赋给了detail message这个成员变量,或者叫实例变量,那么你呢,在这调get message这个方法呀,实际上正好拿到的是这个实例变量它的值。
05:05
所以这块的话,其实大家跟源码就能跟出来啊,这个异常的定义啊,它不是随便定义的,定义俩构造方法它是有意思的。啊,一个无参,一个有参,是不是有这个无参的,这是习惯性的加上去的有参数的构造方法,实际上是异常的信息传过去,一直往负类传,再往负类传,哎传到这儿之后呢,把消息赋给了实力变量啊,那么将来我们调这个get message的时候,诶,你看。他这个方法是不是返回的这个detail message啊,对吧?哎,就是这样的啊,很巧妙啊,这是我们的一个自定义异常啊,自定义异常。那么这块呢,我们自定义这个异常之后啊,我们在我们的user service里边就可以写代码了,对吧,你判断一下,如果是username。You name啊,它要是,嗯。等于等于呢?
06:00
行吧,哎,或者说。这个username,哎,把这个加上去吧,啊,防止它为空嘛,等等,或者说username.les。小于什么呀,六。是不是或者说我们的username.les怎么着大于多少啊?14像只要有一个条件成立,我认为就不行。啊就不行,并且呢,建议大家把这个写到前面啊,这个写到前面可以避免空指针异常,我不知道大家有没有理解这个意思。假如说吧。这叫短路是吧,什么叫短啊,各位。短路是什么意思啊?短或是什么时候发生短路?短路或或者是只要有一边是针,结果就是针对吧,如果左边为针的话,右边是不是就没必要再执行了。对吧。好,那如果说能够到这儿,这说明是不是U内不等不等于空。
07:05
如果是输入string,应该不会出现down的情况,一会儿让你出现一下好吧。一会儿让你出现一下啊。嗯。就是这个情况得考虑一下啊,得考虑一下username等于none。大家思考一下,这个等于空。放到后面跟放到前面有什么区别?如果上来这个UN是等于,那那调用Les这个方法是不是出现空指针异常啊。是吧,哎,所以说you的name等于等于空的这个放到前面。放到前面,如果程序能执行到这个运算不是短路吗?如果没有发生短路,这说明什么呀?这说明这个。
08:00
You的name是不是不等于空,不等于空是不是在调这个方法,就我的意思是大家最好以后啊,就是这种判断给它等于空,判断给它放到最前面。啊,放到最前面啊,放到最前面啊。另外呢?还有一波程序员,我给大家介绍一下啊,就这块儿有个经验吧,算是啊,Username等于等于none。这个判断最好放到什么呀。这个等于none的判断啊,最好放到一个引用啊,引用等于none的。这个判断最好放到所有条件的最前面啊。最前面啊。来,那么这块呢,还有一个经验我要传授一下大家啊,你这样写其实不太好。
09:01
你还会看到有一些特别老的程序员,他这样写,那等于等于什么呀,内。他会把这个none放到前面。他为什么会这样?再分享一个经验啊,再分享一个经验啊,就是编码经验。对吧?哎,You的name等于no,不如写成什么呀?那等于等于什么呀?哎,Username这块的话是我分享一下我这个开发的经验啊,其实是为什么,是为了怕这个问题出现。它什么问题呢?它这个问题双等号你写成单等号了。你写成单等号的话,手手误操作嘛,对吧,你误操作,然后这个时候会把这个none付给这个变量,这个变量就变成空了。这只是一种习惯,各位啊,我给大家说一下这个习惯,就一般情况下,我们也可以这样去写。对,你可以把值放到前面。
10:00
啊,就是。一个判断呢,就是判断空的最好放到前面,一个是判断空的时候最好这样去写代码,这样的话比较比较这个,这个经验比较丰富一些啊,比较丰富一些,但这都不是必须的,各位啊,你要说硬要是这采用别的方式写,那也可以没有问题啊,只是分享一下。当然我们在这个过程当中也要分享很多东西,对不对,哎,那你比如说ABC点什么呀,Equals对不对,哎,Username。那比谁好啊?比username.es对吧,ABC好。是不是啊,那这种情况的话就比这种情况写法好。是不是啊,就是这种写法的话,其实我在这里给大家分享一下啊,跟这个程序没关系啊,跟我当前讲的这个异常这个作业没什么关系,就是在这。出现了这个,我就想唠叨两句啊,就想说一说,拐着个弯,各位啊,这块也是一样的,那等一等user name。啊,一般写法也是这样的一种写法。
11:01
啊,好,那么继续吧,If,如果说什么呀,Now要等于等于什么呀?You name,或者说呢,我们you的name.les呢,是小于什么呀?六。或者说呢,我们you的name啊,点Les怎么着啊,大于什么呀,14,我认为那个。用户名就有问题了,因为我们以前的做法是什么呀,说用户名不合法是吧,长度必须在六到。14之间。对吧,程序到这return结束了,你看以前就是这样的,如果学了异常处理机制之后,那你可能怎样做,这样做你有一个什么呀,叫illegal name exception是不是啊,那你把上面这个信息可能怎么着啊,给它拿过来,是不是拿过来给它放到这个位置上,那是这样,那这个异常呢,我们就得处理啊,对吧,要么TRY开,要么你在这TRY开还是Rose,那肯定是Rose。
12:02
对吧,你拆开是没有意义啊好,那大家想想程序,程序能够执行到此处说明啥,说明用户名合法呀,对不对啊,因为如果这个执行下面代码就不执行了呀。如果程序能到这儿的话,这说明这个没有执行,这个没执行,证明用户名是合法的,用户名合法,用户名合法你就输出呗,S out,输出啥呀,输出这个呃,注册成功。是吧,欢迎谁谁谁对吧,哎,欢迎谁谁谁,欢迎谁谁啊,哎来加上去这个user nameme行吧,对不对,就是这样一个一个逻辑。啊,这个程序其实就是这样写就行了啊,这是一个注册啊,叫用户注册,这是用户名对吧,这个是密码对吧,这叫无效。无效,当用户名长度,当用户名为空为now,或者用户名长度在在什么呀,在六到呃,长度小于什么呀。
13:07
哎,小于六或者长度大于什么呀,14。会出现该异常。这个注释的话,最好还是写一下,因为后期呢,我们要生成一些文档是不是,那么这个时候呢,我们的user service呢,我们这个类就写完了,写完之后呢,自定义异常的这个类我们也写了,那么接下来呢,我们需要测试一下是不是,哎在这里呢,我们新建一个class,那么这个class呢,我们来在这呢写一下吧,嗯,比如说就叫做test得了啊test好,PSVM主方法写上最大化之后呢,我们在这儿首先第一步我们创建什么呀,User service对象吧,对不对,因为调方法嘛,User service user service等于用一个user service是不是好,用完之后呢,User点上register注册,注册呢传一个用户名,传个密码进去。是不是,哎,传个用瓶传个密码进去。
14:01
那当然这个用户名密码需要从控制台接收,我就不再接收了。啊,我就不接收了啊,不接收了,用户名和密码就不在啊,从控制台接收了啊。不接受了,各位,那么这个时候注册的时候,我们加一个我们的一个什么呀,哎,这个方式肯定是不太合适对吧?哎,你要在这干啥呀,Try catch try catch是不是,哎,Try catch,那么这个时候你输出1.getmessage这个方法调get message来得出的信息,对吧?哎,这就是我们异常的信息嘛,是不是,哎那么就这一块呢,你没有办法确保它不能是能啊,它有可能会在这是能有这个可能。啊,有这个是有这个可能的啊,只要是有一丁点可能,你就应该判断,就应该考虑到这个问题啊,是有这个可能的啊来我们走一个。执行。
15:02
用户名不合法对不对。Jack。再来。用户名不合法,Jackson合法了吧?合法的话就注册成功,欢迎Jackson啊,欢迎Jackson,那么这块呢,其实就是一个,呃,主要是锻炼是大家怎么去自定义这个异常啊,怎么去怎么去写我们这个程序啊,怎么去写我们的程序,那么这块的话,大家思考一下,就主要是还是这一步,跟我们昨天的那个例子差不多,昨天那个是占吧。是不是,哎,大家想一想啊,就以后呢,我们开发呀,嗯,很少这种情况了。啊,很少,这种情况一般都是用异常的,出问题就用异常。所以异常可以帮助我们做很多事情。明白吗?异常出现异常并不是坏事儿,听明白了,不要说一诶出现异常了,程序出错了啊,程序出错了不一定,有的时候这个异常啊,他可能是提示你这个项目啊,这个用户啊,有些数据啊提供的不合法。
16:07
对,这是一种很正常的现象,所以说大家不要说诶有异常这个程序就。是吧,啊,另外呢,我在这里再强调一件事啊。还有个别同学遇到异常特别害怕。你知道吧,他为什么说遇到遇到异常很害怕呢?因为他一看到这个就知道调程序要调半个小时了,来大家看啊,有个别同学出现这种情况,反正我以前带了一个学生出现这种情况。来。什么情况呢?你看啊,假如说有一天他写程序爆红了,对吧,出异常了吧,哎,他第一件事是把它关了。当做没看见。你懂吧?啊,当做没看见。他好像心里在一直逃避一件事情一样。就说啊异常,我的天异常。异常是一种非常非常宝贵的信息。
17:03
出了问题之后,你不能吧把它关了是不是,那你这个问题永远解决不了。不要逃避啊,你干什么呢?应该是正面去应对这个异常,而且我昨天给大家讲的很清楚,这个异常这个东西啊。嗯。他有他这个看的这个方式。啊,我不知道大家有没有记住。对吧,哎,从上往下依次看,上面散公司的就不用看了,看你自己的,你自己前面不是有报名吗。对不对,这不报名啊。是不是哎有包名,然后呢,你看看你这个包名锁定的这个类到第几行这块出了问题。你不要先点下边那个啊,下边这个异常是因为你上边这个异常所导致的。听懂了吧,上面这个异常才是这个信息才是什么呀,最根本的原因你点过去。它会定位到这个地方出的异常。是吧,哎,那你要点这一块的话,那就相当于是什么呀?哎,这是你。
18:03
你这出异常是因为什么呀,上面user service第三常出的异常,所以呢,这个东西你看你怎么看啊,千万别在这出异常之后吧,啊关了。啊,那这个就就就不行了,各位啊,不行了,那到目前为止大家接触我们Java程序以来吧,到现在大家思考一下,是不是一般情况下,有的时候是你程序编译过不去报错对吧。编译过不去报错,那是因为你的语法问题,是不是因为编译器只检查语法嘛,是不是,哎,这是一种错,还有一种错是什么呢?是当你运行程序的时候。当你在这运行程序的时候怎么着啊,哎,出现我所说的什么,哎,异常。这又是第二种错误啊,第二种这个这个这个这个问题,第三个问题是什么呢?是直接运行出现的,不是异常是什么呀,是错误。是错误什么什么error,你看所有的异常的后缀啊,都有一个单词叫什么什么什么exception。
19:00
对吧,什么什么什么exception,如果是错误的话,是什么什么什么什么error error啊这个单词叫E。啊,所以应该到目前为止大家接触过三个东西啊,一个是运行的时候直接发生错误,退出Java虚拟机,还有一种情况是运行过程当中出现异常而退出Java虚拟机,还有一种情况是你编译压根过不去,没有轮到运行。编译的时候你的语法上出问题了。你得看清楚你的程序到底是哪的问题啊,那不同的阶段,一般情况下最好调的是哪个呀。各位最好调的是哪个?语法吧,是不是你编译编译帮错,你编译帮错明白什么意思吗。编译报错,你你这种错误就属于没没没运行,还没运行出了问题,这叫编译错误。编译错误最好解决了,对吧,你鼠标停到这儿,它会有提示。对不对,你看他说这个方法怎么着啊,哎,在这个illegal name exception这个类里面没有这个方法。Printer什么什么这个是不是,哎,你检查一下没有这个方法来,你给他来给他补一下是不是这样的话,这个方法就有了,那这样的话,这个问题就解决了,再往下你运行可能是什么问题啊,哎,可能是我们这个运行过程当中出现的异常啊,或者是错误啊,这种信息是这种错误是最不好调的。
20:12
啊,最不好调的,你得会读英文。会读英文各位啊,你得大胆的去读出来,大胆去读出来啊,不要逃避,不要出现,你现在的错误是不是还少啊,将来一做项目,我问你一大坨吧,是不是三四百行的异常信息啊,有没有可能很常见,各位啊,我不是吓唬你啊,300行的异常很正常。就300行的异常信息很正常,就是你因为一个地方出了问题,EEE,因为A导致B错,B导致C错,C导致B错,D导致E错E导致F对吧,你错了一大坨,是不是三四百行的错误信息,你看着就头疼是不是,但是你要静下心来,第一你要观察上面这个信息是啥。这是第一件事儿,第二件事儿是找到自己写的第一行代码,找到问题的根源,定位过去,好好看看它有没有什么问题。
21:02
啊,然后呢,你可以怎么着呢,哎,可以可以就是静下心来,哎,把它好好弄一弄啊,当然我们也可以有什么呀,Debug工具。对。叫debug。就是加断点调试对吧,你说程序出现在这儿问题是吧,点右键你这debug呀,是不是debug这个当后期再说啊,后期再说,现在先不用管它啊,Debug先不用管。好了,那么这块呢,咱们了解一下啊,了解一下各位,这个是咱们的一个,嗯,作业啊,就说到这儿。
我来说两句