00:00
好,这个结束以后的话呢,我们接着来看这个第六个点,这个呢叫自定义异常。哎,说呢,我们在刚才的演示当中呢,我们肉呢,可以抛出异常的这个对象,那此时这个异常的对象呢,我们就用的API现程给我们提供好的啊,Exception也好,Runtime exception也好啊等等,呃,那实际在开发当中,我们说呢,还可以呢,去自定义异常类。自定义完以后的话,你这块抛的话,你可以抛你自定义的这个类的这个对象了。哎,我们先把这个事儿呢,先做一下,比如说下边我们就可以呢,去制定一个。这个自定义的话呢,我们可以呢,就具体的写一个了啊嗯,针对于咱们刚才这道题,你看这儿呢,我们是复数的时候呢,他就不让我们这个去输入了,就抛一个异常对象了,不妨呢,我这块呢,就造一个哎自定义的异常,这个异常呢,我们叫做诶below。比如叫zero。啊,这样的一个exception。哎,就它了啊好,那么这呢,就涉及到了我们如何去制定一个异常呢。现在呢,我就写个类,这个类呢是继承object了,那么这个类造个对象能让他抛吗?
01:01
比如回过来学生这块,这呢是他是吧,我现在就把这个呢给注释一下,你说我现在我也想去抛,哎,我就抛一个new叫哎below。啊,叫zero的,这样一写呢,就直接报错了。那为啥不让我跑呢?注意我们这个抛后边呢,明确说了是不是一个异常类的对象,现在你是异常类吗。显然不是,是吧啊,你这样抛的话呢,跟我们这样抛呢,其实也没什么区别啊,你就好比说我扭了个string一样。这个位置你也写了,说输入的ID非法啊,看着好像说呢也没啥问题,其实完全不行啊,后边跟着呢,根本就不是一个异常类型的对象。所以呢,这都不可以啊,这个不能抛,你也不能抛,那怎么就能抛了呢。对,那你这块你得得认个爹是吧。你得继承异常的体系啊,那继承谁呢?那就看你想是一个什么异常了,你说我想是一个运营时异常,那就认这个。啊,那这个呢,刚认完这块呢,你看回来这就好使是吧,诶那最起码你现在已经是一个这个体系下的一个对象了,那你就是一个异常对象。
02:09
那就没问题啊,那如果说呢,这个是运营是异常,其实那就可以考虑不处理了嘛。运营是一场嘛,是吧,诶但是呢,你要这块呢,让他去继承的是。Exception是吧?哎,这时候你要这样写,那回过来这块呢,这就不行了。因为你这是一个非运营式异常这块就一定要处理了是吧。哎,这不就有这么个区别吗?啊,这个很好理解,好,那这块就涉及到了说,诶我们该如何呢,去制定一个异常类呢,似乎呢,看着是非常的简单的哈,诶那具体的话呢,还有没有其他的要求呢?其实也有有这样的几个步骤,第一步呢,首先你自己的这个类呢,要继承于现有的异常体系。可以呢,是继承于runtime exception或者是exception,这是第一步,然后第二步的话呢,怎么做呢?呃,其实这块接下来怎么做,你就看看他怎么做的,他怎么做,咱也怎么做看看。他那一进来之后,哎,它是继承于这个比较大的了啊,咱就不继承它了,然后呢,它有一个这个东西哈。
03:06
这个东西呢,咱也不知道是干啥的,那咱先不管,往后看这一个构造器,这是个构造器,这是个构造器啊,这呢还是个构造器。还是个构造期就没了。哎,还是挺简单的是吧,那要是抄一抄他的话呢,那我们也这样去做,我们呢也整个构造器,诶public,哎叫below。哎,Zero啊exception诶,他整过这个空餐的,咱们也整个空餐的,他那整过代餐的,咱也整俩代餐的。哎,这个怎么着呢,我把它呢CTRLC啊选中一下这个它怎么整的呢。嗯,他有过,你看这是个空参的,咱们也空参了啊,他有个这个。咱也抄一抄。哎,里边呢,写一个,哎瓷砖类型的。Name是吧,然后呢,这里边儿呢,怎么做呢,它的super咱也调super。哎,叫name。行,只不过呢,他super呢是super到这个了,咱super呢是super到他这儿了。
04:01
这不一点就点到他这儿了。那他有个这个,嗯,其实这块你要抄抄也行。就跟着他一样就行是吧。哎,粘过来,然后把这个类型改一下。这不就完事了吗?哎,他怎么做咱也怎么做就行。好,这呢就相当于是提供几个重载的构造器,根据实际问题,你看你想造哪个,呃,对象的时候呢,用哪个构造器,你就直接自己指定了就可以了,这是一个啊,另外的话,你发现呢,它这里边儿有一个这个啊。啊,这个话呢,不知道他干什么的,似乎呢,存在就是合理的是吧,那我们是不是也CTRLC想抄一下。哎,那我也就粘过来了,但粘过来的时候你小心一点啊,这呢是一个全局的常量,这个名呢叫zero ID叫序列版本号。哎,全局常量呢,是不是对于这个类来讲就是唯一的是吧,那人家这个类呢是唯一的了,那我们抄过来的时候呢,你最好你改一下。就你抄作业的话呢,你也得改改名是吧。别跟人家这个卷子交的一样,都是那个同学的了啊,所以这样呢,我们把这个数呢,稍微的改了改。
05:04
啊,改了改的目的是什么呀,这个号呢是识别这个类的,我们这个号呢是识别这个类的,那有同学就说这到底有什么用,这个事儿的话呢,咱们先不在这解释,我们后边讲IO流的时候呢,会讲到一个呃对象流,呃到那个时候呢,我们解释呢,大家啊就比较清楚了,现在说呢,可能也说不清楚啊,大家也理解不到位啊。总之的话呢,我们在提供一个异常类的时候呢,都要加上一个它比如说呢,你看我们CTRLN,咱看一看人家这个叫runtime是吧。Exception。啊,Right time except你进来之后你发现它也有,而且这个数呢,跟别的都不一样,呃,就是大家呢,都得有这么一个值啊,来唯一的标识当前这个类。便于呢,在传输过程当中啊。就知道你是你是吧。哎,这个意思啊行,具体的细节呢,我们到IO流的时候呢,再说那这样呢,我们制定一个异常类呢,就说完了,那回过来我们看看如何去制定异常类啊有什么要求呢。
06:01
哎,首先第一个点。要继承于现有的。哎,对,异常体系的某一个类是吧。哎,异常体系,哎说通常记成于哎如果呢,你要是想表达的是一个运营式异常呢,你就叫做runtime exception。哎,或者的话呢,你就让他去继承也叫。Exception。对,这第一个事儿啊,第二个事儿呢。哎,通常。哎,提供几个重载的构造器。哎,他这样做的,我们也这样做,第三个呢,诶提供一个全局常量是吧。哎,然后呢,声明为。哎,就我们刚才看到这样的一个场景。哎,这样子的。哎,当然后边这个值的话呢,你这个根据实际问题,你自己写一个,你别跟的这个一样了。哎,就行,我这个值呢,我就不往这写了。好,这就完事了啊,这是我们的第三个点。行,那这个洗完以后的话呢,下边我们就可以去使用了,那如何去使用呢?我们在具体这个场景当中,比如我们这个问题里边,我就可以去拗了,然后呢,因为我们也提供这个代餐的这个构造器了,我也可以呢,就这样去写。
07:12
啊,这个呢,注意咱们这儿呢,是一个报错的。然后此时的话呢,因为你继承一现有的异常体系结构了,它就不报错了,然后这块呢,就抛出了,抛出的时候呢,相当于以多肽的方式呢,呃,就相当于抛给了这个exception这个类型了,上面呢,我们再去做这个接收是exception,哎,这个exception的话呢,我们打印的是这个对栈信息啊,现在我们去run一下。啊,实际呢,大家你看这个执行的时候呢,这不抛出来就是你自定义的这个类型的吗。哎,就这个信息。然后呢,我们在这儿呢,传了一个十参。叫输入的ID非法这个信息呢,其实就是我们那个。比如把这个注入掉,我们一点get一个message啊,去打印一下,这个呢,就是你这个构造器的那个参数。那就他。
08:00
啊,这个大家做一个了解就行。诶,这个我们就一般的不用它是吧,一般我们都用它了啊,因为你发现呢,这个打印的里边其实包含了这种信息了。哎,这就可以了啊好,那么回过来,刚才提到说诶自定义好了,那下边该如何去使用呢。哎,如何使用呢?我们说呢,就是说哎首先呢,是在具体的啊这个代码中啊,满足指定条件的。呃情况下,呃需要呢,手动的使用,就相当于我们现在是自定义厂内哈,它呢不会自动跑了,它必须要我们自己是不是写这个死肉了。哎,加上你这个。哎,自定义异常类的对象。啊类的这个对象,哎,通过这样的手动的使用这样的这个方式。呃,然后呢,就是将啊异常对象呢,这个诶抛除是吧。啊,这是第一个事儿,那下边呢,我们再补充一个哈,如果呢,你这个自定义的这个异常类的这个类型哈,它是继承于这个exception的话,Exception的那就是你是一个非运营了,那么就要求呢,你下一步呢,既然你都抛了下一个环节是不是一定要考虑处理的是吧。
09:13
啊,那就是如果。哎,自定义。啊,异常类啊是非运行时异常。啊则啊必须考虑啊,如何处理此啊异常类的对象。啊,那么具体的话呢。那就是两种是吧,一种呢,就是try catch finally。啊,那第二种呢,就是你是吧,这跟咱们前面讲的就都一样了,就啊。好,就完事了。啊,相当于上面呢,我们就说清楚了,我们该怎么去使用这个自定义长类了,那下个问题。诶,为什么要自定义厂里呢?嗯。啊,这个不能用,具体问题具体分析了啊,刚才有同学说了,说我这个分子分母这块呢,说不能为负数的情况是吧,说你这块呢,你得用,但是我这块我不用自定义异常了呀,我直接呢就用一个现成的。
10:12
这个呢,其实说明的是啥呢?为什么我们要手动抛。想想。好久不写字了是吧?手动刨哈,就是你一个分子分母要求不能为负数,这个指的是你为什么要用死肉是吧?咱们现在说的是为什么你要死肉,后边跟的是一个自定义异常类呢?你看我们刚才这个学生这个问题的时候,咱们说呢,你不能为负数,那咱们这块呢,一开始不就是了一个exception,或者我一个exception,这不就挺好吗?干嘛我非得写它呢?A。建明之义是吧,那这四个字其实就非常有分量哈,你会发现呢,咱们讲IO这个体系的时候呢,是不是有相当多的异常。这块呢,比如我们先写一个叫exception。诶,这个exception我先进来,这里边的话呢,你看首先这就很多了啊,然后呢,其中有一个呢,叫runtime exception我们点开进来,这又很多,其实呢,你要打开这些具体异常,你去看一下它里边怎么写的呢,你发现呢,跟我们刚才自定义的差不多。
11:13
啊,继承一个类,提供几个构造器,整一个序列,版本号没了。都这样写的,那你说你这么多干脆完了,直接就合成一个,就叫做runtime exception不完事儿了吗?干嘛整这么多呀?你会发现呢,咱们在写代码的时候呢,我啊一执行报了一个空指针异常,他实际呢,在这个位置写的是不是就是空指针异常。就非常明确,就像我们这个题目呢,你看现在我这是用的这个prince sta哈,诶文运行此时呢,这块报的是它。你一看这个名,你是不是就知道,你看我这是有负数了是吧。哎,我们呢,写的这个控制异常一运行呢,这块呢,就一看控制异常你就知道呢,你肯定那个对象那块呢,没有值。啊,一块儿呢,一下呢,这块报的一个叫啊,比如说这叫呃,Number for me exception,你考虑呢,可能是像字符串呢,转成数值的时候呢,出的问题,所以呢,这个异常这块啊,其实我们挺关心的,就是它这个名到底叫什么。
12:14
通过这个名呢,我们就直接知道呢,它发生的是什么具体的问题了。那既然我们如此关注于这个名,咱们就不会呢?在一些具体的场景当中,像这道问题啊,我们如果去抛一个time session,其实就有点儿莫名其妙的。不知道到底是怎么回事儿了是吧?诶,对的啊,所以这呢,也是我们主要呢,自定异常的一个意义所在,那从那个点出发的话呢,只要我们在实际的项目当中,大家呢,说你有一些额外的一些诉求要求啊,那要只要出现这样的要求的话呢,通常我们都自定义了。OK啊。啊,这块写一下,就是我们其实更关心的。呃,更关心的是呃什么呀?呃,就是通过异常的名称就能直接。
13:03
判别啊,或者叫直接判断。啊,此异常出现的。啊,原因是吧,而不是呢,仅仅靠你这个所谓的message啊,那既然如此。哎,我们就有必要。啊,在实际开发场景当中啊。诶,长颈鹿,哎,不满足我们指定的这个条件时。呃,条件师,然后指明,呃,我们自己是吧,呃,这个叫什么特有的这个异常类。哎,或者叫特有的,这个异常就是特有的异常类吧,哎,通过此名称。通过此异常类的这个名称,哎,就能判断出。啊,具体诶出现的这个问题。哎,就这样一个情况啊。好,这呢就是我们说使用它的一个意义了,那以后呢,大家就知道什么场景我们去用啊。
14:03
好,那这块呢,其实我们就讲完了,那这个讲完之后呢,其实咱们针对异常的整个这一章节内容啊,就算是收尾了。好,那么异常整个这个知识点呢,咱们就告一段落了,那接着的话呢,我们来看一看爱的硅谷零五下边的几道题目,诶,通过这一道题目呢,大家再去熟悉一下咱们说的这个异常的内容,第一道题的话呢,其实咱们已经讲完了,然后接着我们来看这个第二道题,第二道题呢,相当于是一个类似于笔试题这样的一个场景了。看这啊这呢定义了一个method a,静态的啊有一个try finally,所以呢,大家也能看到这个catch呢,其实也是可选的,这呢有一个method b啊也是一个try finally,然后me方法当中method a method b这样呢进行调用的,那我们需要呢,就是看一看这个程序呢,输出的结果是什么。这呢咱就一起来看了,首先呢,对于这个method a来讲,由于呢,你看它这块呢,有个Rose还是一个非运营时异常了,所以这块一定得是TRY开始去处理了啊好,那么我们这儿呢,就进入到这个方法里边。
15:03
这个先看may方法啊,就大家呢看这种程序执行的话呢,都是先找入口,没方法里边呢,一进来它就执行maa了,所以我们就跑到这儿来了。所以呢,我们要看输出结果的话呢,首先一上来就会进入方法A,把这个呢给输出了。然后呢,接下来呢,他会抛一个异常对象。他一旦抛异常对象了,整个程序呢,就要出去了啊,就要结束了,但是你等等。我们有个finally。所以说呢,这呢是第一个输出的结果,第二个的话呢,是不是就它了。也就这个输出没有。这个呢,只是抛个对象,人家没有任何的out语句哈,所以呢,这是输入它,输入它,然后呢,整个呢,拿着这对象呢,就肉出去了。出去的这个对象呢,在这个位置是不是给捕获了。补货以后呢,我把你的message给打印了,他的message就是制造异常。对,所以这块我们去运行一下,那结果的话呢,这不就是哎这个,然后finally里边的这个,然后这块出去以后呢,我们在这呢,去有一个get message的print,这不就是它吗。
16:07
这就我们这个方法A执行就结束了,然后看一下这method b method b的话呢,它是一个try finally在这里边呢,一上来说进入方法B,进入方法b return这个呢就要结束这个方法了,但是你等等我有finally,所以finally这块呢又调用了一下。然后呢,你再结束这个方法,结束方法这块也没有产生任何的异常对象,这个呢,就正常的结束就完事了。哎,就这样一个场景。啊,不是特别复杂啊,大家呢,再捋一捋。你也可以呢,走一下这个debug是吧,啊一步的往下这个去执行也没问题啊,比如这块你加个断点啊,这时候我们就点一下这个debug操作。好,这时候我们代码就跑到这来了,这时候呢,这一行代码还没有执行,我们想看一下的一个执行这块,你就点这个是吧。诶一进这就进到这儿了,首先呢,这块呢,我们往下呢,走一步,你会看到这个Co这块这不就输出了吗。然后这块呢,就跑到这儿来,然后我们再往下走一步,这块呢,其实就直接蹦到我们这个finally这块了,这个呢还没执行呢哈,然后呢,再往下走一步,这块这不就出来了。
17:08
然后再往下走一步,这个异常呢就抛出去了,抛出去在这块呢就可开始了。开始的话呢,再往下走一步,这个这个还没执行呢哈,这不就输出了是吧,然后呢,接着就0MESSAGE b了,再进去,然后依次是吧,哎,这样的一个场景诶。就结束了。刚才呢,我们是把这个过程呢,就呃手动分析了一下啊,你也可以呢,去走这个debug。这道题就结束了,接着看下一道题。诶,这道题的话呢,你看这个题面呢,还有点长,我们就一点点来这呢叫游戏角色的一个设计,在这里边呢,需要设计这个角色呢,我们就用一个人person呢来去表示了,说每一个人的话呢,都有他的名字和生命值,角色的生命值啊,不能为负数,所以呢,我们在设计的时候呢,就可以自定义这个异常类了啊。所以呢,当一个人物的生命值为负数的时候呢,就要抛出自定义的一个自定义的一个异常是吧,少一个亿哈。好,那么具体的操作步骤的话呢,首先让我们就去自定义这个异常类了,叫no life value的exception,按照这个要求我们就去做就可以了,所以呢,首先把这个事儿呢,我们定义一下啊,CRC。
18:10
啊在这,哎叫no life,先先这样吧。这有点长,我就直接呢。复制一下是吧,这样。然后呢,把这个事儿CTRLC一下。咱们就写到这儿。好看一看啊,也回忆一下,我们如何呢去自定义异常类,首先的话呢,让他呢去继承我们现有一个异常的一个类,它这呢是继承了这个runtime exception。啊,Run time exception好,这是第一步哈,下面提到这个构造器的问题了,那构造器的话呢,我们就写一下是吧,比如说首先呢,我们去提供这个叫空三的构造器啊,我们就alt加insert构造器这块先调负类的空参的,那就是你自己这块也是空餐的了。哎,我们再来一个代餐的,比如呢,把这个message呢,给大家提供上的,诶就先这样写了。
19:00
说呢,在有三的构造器当中,需要调用负类的有三构造器,把异常信息的传入,其实呢就是这个意思。OK。那其实呢,大家你看了一个本质哈,我们这个时候呢,你传了一个信息,这个呢调到super super就跑到这儿来了,它又调super了,就调到我们这个exception这了,Exception也super了,再点就点到throw这里边了,Throw这里边呢,是把这个messenger赋给了当前的叫detail message,显然呢是一个属性。然后这个属性的值呢,咱们提到过叫get message是吧,CTRL f12呢,这里边儿就有一个叫get message这个方法,这个方法呢,其实不就相当于刚才属性的get方法。所以我们为什么说get message就能拿到你这个回头我们提供这个构造器的时候呢,填的这个信息,其实呢,就是get你这个通过参数呢的那个属性的值。OK。好,别忘了还有一个东西,这呢,是不是有个序列版本号是吧。诶CTRLC一下啊,这个别丢了,可能有同学会说说我这块丢了,发现也没什么错误信息啊,这个咱们后边呢,到时候再说啊,就是即使你没写,它也会自动给你附一个。
20:02
只不过负责这个呢,可能不是确定的,当你修改类的时候呢,这个值呢,会变化,变化呢,可能在一些场景下呢,会影响代码的正确性。啊,以后再说。这个类呢,写完了。回过来另一个person类啊,有相关的这样的一些属性的信息,这个还是挺多的啊,这个我们就直接这样了,CTRLC。这个类。嗯,这个粘过来啊。行,这块我们稍微的调一下格式。我再往前一点啊。行,看这几个事儿,首先呢,第一个说提供了一个属性叫private string类型的一个name。生命值这个来private型的,我们叫life。Value。嗯,行,就玩游戏的这个这个生命力是吧,生命值。
21:02
嗯,接着的话呢,去提供相关的这个get和set方法,行,这个呢,目前呢,我们就先自动的给它先生成啊。方法这个都写好了,然后这里边有要求在这个set啊,Life y这个里边啊,首先你需要判断一下这个life这个值,如果要是负的话呢,我们就要抛一个异常了。那这个呢,信息呢叫生命值不能为负数,然后呢,就是这呢,把你这个值到底是多少呢也写出来,然后呢,再给这个成员的life y6呢去赋值,这个呢就是如果你要是满足的话呢,就赋值啊行,这个重点我们要操作呢,其实是这个操作了。在这里边儿呢,一上来我们先去判断一下啊,说如果呢,你这个叫life value呢是小于。他说小于零没说等号的事儿是吧?等的话呢,那就是你个零也行啊,如果你要是复数的话呢,我们就要去一个我们刚才no life except这里边呢,需要写这个信息,信息呢,人家也告诉你了这样写。
22:00
CTRLC。这么着,然后后边呢,我们再去加上一下。诶,你这个叫a life value,就是你这个负数到底是几是吧,把这个也传过去,呃,如果呢,你要是负的话呢,就直接抛一常就出去了,否则的话呢,直接我们再赋值。所以这个呢,就不用写O了,是直接就这样写也行。因为你要付的话呢,就出去了也不会付啊。这个呢就是关于赛的方法,然后提供空餐的构造器,提供有参的构造器,行结构造器的问题,比如说我就写到这了。先来一个空餐的。诶,这个啊,好,再来一个代餐的。代餐的话呢,我们把这两个属性呢,都给它附上。那这时候在负的时候呢,稍微小心一点,我们下边写这个赛方法的时候呢,提到了说你负的话呢,你不能整负的,那你要是整构造戏去负的话呢,同样的道理。所以此时呢,我们就不要直接这样去掉了。我们可以考虑用这个set方法是吧,然后把这个life value呢给它传进去。哎,你要是这块写的负的话呢,照样掉它的时候呢,该报异常还报异常。啊,这个意思啊,行,那至于说上面这个的话呢,我就直接写了,或者你说希望呢,看着整齐一点,那你就用这个s name啊也可以啊,这个是小事。
23:10
哎,这样也行。好,这个呢,是我们提到这个构造器的问题了啊,那这呢就结束了,然后回过来下边呢,就是具体的这个测试了。新建一个类,这个就是这个测试类,就这样测试类里边这块呢,就提到了具体的一些这个情况了,啊,其实无外乎呢,就是让我们去造对象啊,体会一下这个抛异常的一个问题。诶看一下正在使用满餐的这个构造器呢,创建person对象生命值呢,如果传上一个负数这个时呢,就遇到异常了,然后呢,后边代码不执行了是吧?这样个场景,然后呢,再使用空单的构造器造对象,然后呢,我们再主动的去调这个方法,传正的传负的,看看这个异常的产生的一个情况。其实比较清晰啊,这呢我们就来个酶方法,嗯,比如说这块呢,他提到第一个场景呢,我们是使用这个有参的构造器。
24:05
哎,行,声明的是person p啊,你有一个person。哎,这么着啊,然后这时候呢,我们CTRLP一下参数的话呢,有两个,一个呢叫name,这呢,比如我们来一个叫。Tom吧。然后这个生命值呢,我们写的,比如说是这个十,那此时呢就没有任何问题,咱们在person里边给它加一个to string。哎,补一个啊,诶把这两个结果呢打印一下好回过来,这时候我们就直接在打印的叫AP了。这个呢,我们做一个执行。哎,没问题啊,这呢是正常的,然后呢,我们要是啊接下来啊,给它复制为是一个负数的话,把这个我给它注释掉了啊,再复制一份,把这个打开,这个呢写成叫诶复始了。那么此时的话呢,我们在构造器里边呢,给它附一个负数,这个时候呢,这不就小于零了,这个呢,就抛出一个异常。给抛了异常呢,因为你是一个运行时异常嘛。在这儿是吧,哎,所以说呢,我们这时候呢,就没有去死肉的去处理啊。
25:04
啊,进而呢,我们回过来的时候呢,哎,到这个位置呢,他就诶到我们这个person这块。哎,掉了构造器也就接着往上去抛了,然后再抛的话呢,抛到这儿,其实这个程序呢,就结束了是吧。这个呢,还输出吗。还输出不?不输出了,因为你在调构造器的时候,这个异常已经出来了是吧,出来以后呢,这个你也没有去开始补货,直接这个程序不就结束了吗。OK,来执行一下。你看这就挂掉了,最后出的这个信息呢,就是这样的一个异常,然后呢,这是它的一个message的信息,没有后边这个P了,就。行,这呢是我们不希望看到一个场景啊,或者换句话说,我没有处理,你要想处理一下话呢,无外乎你就是加一个。踹是吧,把它这样包一下。哎,这么着,然后这呢写一个开。这里边儿呢,写一个啊,No life value exception。一点,这个我们可以感受一下啊,Get message其实就是我们拿到的这个信息。
26:03
来我们这块呢,再做一个run。哎,这就行了。OK啊,那其实呢,大家就没有必要去处理了,因为是一个运行时异常。啊OK,这呢是算第一个演示啊,第二个呢,我们是使用叫空餐的构造器啊。好,这个person一个P2NEW一个person,诶空调构造器,然后P2呢,我们去set一下它这个name啊,比如说这个叫Jerry是吧,诶P2点set一个life y6来一个十。哎,这样啊,那由于呢,上面这个代码呢,虽然说它也有异常,但是我们开始调了啊,所以这个代码后边呢,是不是也能执行。啊也能直行,只不过呢,这执行的时候这块呢,又跑一场了啊。来run一下。诶,所以呢,你看我们看到的情况,上面这个呢,是我们自己呢打印的,然后接着往下走的时候呢,在这个位置出现的,这不是在36行这个位置啊,又掉了你这个对应的这个方法,这不就是这个方法吗?这个方法在这个位置上抛了一个异常的对象。
27:00
哎,这不就打印出来了。打印的话呢,这个是它自动的一种行为啊。这个就完事了吧。就这道题哈,感受一下就行,你要负一个正的话呢,它不就不报错吗?一会把这个除掉,这来一个十。这个就是正常的啊,你要是打印下这P2呢,是不是就都能打印出来。哎,这就没问题啊,行,这个就是我们说的这道题,这呢其实还是练一个叫自定义场内啊,然后呢,在我们这个代码当中,我们去使用死肉呢去抛出啊。好,这个我们就过掉了。好,然后接着的话呢,我们看这个练习四啊。这道题的话呢,这个题面猛一看,感觉稍微有点懵啊,里边涉及到这个异常的类型呢,其实挺多的。这道题的话呢,可以看作是呢,对于咱们这一章基本上讲的这些知识点的一个汇总了。异常处理,两种方式都涉及到了。然后呢,死肉呢也涉及到了自定义,常类呢也涉及到了。稍微看一下,首先这块提到了,我们去定一个这个程序叫这个名,那咱们就定一个这个名的。
28:04
哎,叫他啊。好,我来接下来说,在这个程序里边呢,我们接收命令行的两个参数,就是从控制台呢,我们输入两个参数,输入的这个值啊,不能是负的。啊,那就是说你要是负的话呢,我们就抛一个咱们自定义的一个异常类了的对象了啊。然后呢,输入这俩数呢,我们去计算一下它们相除。那在这个过程当中呢,会出现一些异常,比如说呃叫number for me exception,呃,要求输俩数,结果你输了一个ABC啊,这个呢,就属于这种异常了,缺少命令行参数。嗯,这个时候呢,咱们使用的是这个魅方法,魅方法呢,它这个行三不是可以接收吗。使用的是这种方式,那明明呢,我们是需要接收两个数,你要是只写了一个,它就会报这个异常。其实呢,就是书读脚背越界了。那这个,然后那两个数相除的话呢,分母如果要是零,就会报这个异常。
29:00
哎,你要输入的是负数,就报这个异常。其中前三个呢,其实都可以列成是自动的就会抛的,而这个呢,是我们自己指定的。啊,这呢,就属于得自定得去主动的去死肉了,然后死肉的话呢,这块呢,因为是我们个性化的一个需求了,所以这个异常的类型呢,也是我们自己创建的。就是这样的一个过程啊好,下面就给我们相关的一些这种提示信息。嗯,OK行,这块呢,大家呢,下来可以参照一下它,我这呢就直接来写了。在这个类里边呢,我们写了一个main方法,他希望呢,是通过这个参数呢,来传递过来的两个数啊,那相当于我们现在就直接能够去用这两个数了,一个呢叫X0,一个呢叫做X1。哎,这两个数,但是两个数的话,你注意它是一个死论类型的,我们现在让他做除法呢,是不是得做一个转换呀。所以我们需要使用integer.pass是吧?哎,我把这个呢放进去。诶,转换过来的就是一个数值,比如叫M。
30:02
那对应的话呢,我们再复制一份是吧,这个我就把它就删了啊,这个呢,就是一这个呢,假设我们叫N。好,那么这样的两个数呢,就得到了,接下来呢,让他俩呢做这个除法,这个除法呢,这个需求呢,是放到一个方法当中了。就是这个方法行,那这呢,我们就调一下这个方法啊,这个方法的话呢,呃,你要是声明成一个非静态的,那就得拿这个当前的对象去调了,那这块呢,比如说我就写成静态了啊,直接来调啊,调完以后的话呢,有一个返回值。哎,这样啊,In的一个M。啊,Int一个N。行就这样啊,然后在这里边的话呢,我们其实就做除法就行。哎,做除法,然后呢,把这个值返回,但是呢,你这个去除的时候呢,稍微的小心一点,我们这有个要求说它俩呢不能为负数。这个负数的事呢,咱们可以在这里边儿呢去判断啊,说如果呢,M小于零。哎,或者这个N呢,小于零。
31:00
这时候呢,我们就要抛出一个异常的对象了。手动。哎,抛出异常类的对象,这个呢,我们就可以呢,去用这个叫死肉表示手动抛出了啊,你一个异常类的对象,只不过这时候我们用的这对象呢,是我们个性化的一个需求,你是附属的这种场景,所以说你拗谁呢,好像都差点意思,那干脆自己定义一个名得了。啊,这个我们就自定义了一个啊,在这里边儿提到了啊叫below zero的exception。好回过来那写着写着我们这个就写不下才去了是吧,就接着来去这块去补充啊,哎,继承于谁呢。这块呢,也没有明确说是吧。那干脆我们去继承一个上面呢,我们这个题目呢,是一个运营式异常,这在哪来一个非运营式异常了,我叫exception了。好,再回忆一下,我们当时怎么定义的啊,第一步呢,是继承现有的异常体系,然后呢,下边提供构造器。哎,整一个比如空餐的。这样一个代餐的,代餐的话呢,一般呢,这个呢,通常都会提供啊,下边这个的话呢,你不想提供的就不提供了。
32:04
这俩了,然后再来一个序列号是吧。其实就抄一抄,他怎么做咱也怎么做啊。但是你其实把这个值呢,你稍微动一下啊,因因为刚才那个值呢,是人家这个类的啊,唯一标识这个呢,是你自己的。写完事儿了啊,写完以后的话呢,回过来,诶在这个位置呢,咱们就可以去使用了,诶new一个叫诶below zero的exception这呢,我们可以写一个,它这块应该有我们提示啊,哎,输入复数是吧。那我们就写一个啥叫输入负数了。哎,就简单一点,这样来写的好,为什么现在还报错误呢?对,因为呢,你这是一个非运营式异常了,你抛了是不是得考虑处理啊,所以这个处理呢,咱们就不在这里边处理了,咱就使用的这个叫死肉是吧。我就一下这个异常。哎,就这样了。好,这呢是你要不满足条件的,这样,如果你要,哎不是这样的话呢,我们就直接return了。
33:02
哎,瑞出去了,其实这块呢,大家可能想,诶分布可能为零是吧。诶,V0的这个系统呢,已经自动给我们去考虑此肉了,咱们就不用管了。好,整个这个方法的话呢,会在这个位置呢被调用,因为我写成静态了啊,所以我就直接呢,就不用用对象调了,把这个M和N呢就放进去。这呢,我们就接收到一个值,加上呢就叫做result了。那由于呢,这个位置你死肉过来了,所以呢,在这儿呢,是不是得考虑处理了。不处理不行是吧,哎,那咱们先把这个结果先打印一下啊。结果为。哎,加上一个我们这个叫诶result是吧,这样好这呢,就是整个我们这个程序是这样子的,下边呢,我们来考虑这个异常的处理。其实呢,对于这种运行时异常呢,咱们是可以不处理的啊,像上边这个呢,你可能叫number for me了,这里边儿呢,在除的时候可能分母为零了。然后这个位置呢,你在传值的时候呢,可能光传了一个,第二个没传,那你再去调一的话呢,这不就较为尾界了吗。
34:00
像这些呢,都可以不处理,但这道题呢,是希望我们给处理一下的。啊,那处理咱就处理吧,那可能出现了异常,刚才说这也有,这也有,唯独也就他们有。但你要把它呢,放在这个,哎,揣的外边的话呢,它又看不见了是吧,哎,干脆呢,我们就都放一起得了,所以把这块代码呢,整个呢,我们就给它包起来,那后边的话呢,咱们再去处理异常的时候呢,咱就用不着自己去写出来开始了。昨天咱们讲快捷键的时候呢,提到过啊,Ctrl alt加个T。这时候呢,会掉出来了,你看这样的结构。这里边儿的话呢,咱们目前其实用不着finally,我就选这个了啊。我点一下。那基本上就给我们都包起来了。这个呢,在呃,这个咱们当前这个idea版本当中,咱们用的是2022.1这个版本,它这块呢,自动的在这里边是这样写的。开这边你看死肉是吧。他又把这样一个编译时的就是非运营式异常呢,在这里边我们死肉又出去了是吧。
35:01
哎,你要是用的是idea呢,前面这版本呢,一般呢,它都是默认的用的是这个。那咱们呢,目前也别让他再往外去肉了,咱就也用它得了啊。好,我就这样呢,调了一下,好这呢只是针对于咱们这个非运营时异常给李总处理方案,其他的没写没写,其他就咱自己写了啊,那由于呢,各个异常类型呢,又是并列关系,所以谁上谁下呢,无所谓了啊。还有可能呢,是这样的一些。啊,CTRLC。这个呢叫数据类型不一致啊。回到这儿啊。嗯,啊,其实这个的话呢,咱们也改一下吧,咱都写成一个输出语句吧。睡觉。数据类型不一致,哎,上面这个的话呢。这个咱们因为在这儿不是写了一个message的吗。我就直接这样了啊,打印一下1.getmessage是吧。好,下边呢,还有开始。嗯,在这儿。哎,就他比较输,缺少命令行参数。
36:02
哎,其实说白了就是你这个。小记了啊。缺少命令行参数。哎,还有一个啊,除零了。哎,这个就简单点啊,就写一个叫除零。零哎,就可以了。好,那么这道题呢,其实就写完了啊,好,下边我们来测试一下,看看在什么样的场景下呢,能出现出现这样的几种这个异常啊来我们去做一个run,这个做run的话呢,其实它就。出来了一个异常是吧。嗯,因为我们也没有传任何的值,没有传值呢,其实这个速度的长度就是零啊,在零的场景下,你非要调指定的这个角标,这不就相当于是没有嘛角标为界了啊,其实这时候呢,出现在是这个吧。哎,所以这块呢,就缺少命令行参数啊,那现在我们去演示其他的这几种情况,这个呢,我们要么使用命令行的那种方式,要么在idea里边呢,咱们也稍微提到过。
37:03
就是在这个位置是吧。点进来针对当前这个module,针对当前我们这个是这个程序吧。哎,正好是他是吧。哎,针对于它,然后呢,我们去在这儿写参数。那我们先来一个正常的啊,比如这呢写个12,这写个二,前面这个呢,相当于付给这个X0。诶,上面这个啊,然后二呢,给这个X一行。然后我们这块呢,点OK来做一个run。这呢就就是正常的做除法,结果呢就是六。诶,这是我们希望看到的啊,然后再接着我们重新再回来到这儿。嗯,然后呢,我们这儿呢,少一个是吧。少一个这个情况呢,其实跟刚才我们这个一个也没写呢,是类似的,都是叫缺少命令行参数。哎,这个没问题,好再回来,比如说这个位置呢,我们写了一个ABC是吧。这个呢,在转化成这个int类型的时候呢,就转不过来了。
38:00
这就出现我们的这个问题了,是吧。数据类型不一致。哎,这就出现了,好,然后这个出现了,然后呢,这个出现了出零。哎,这呢写个零。Run一下。这就出零了,好,还有一个我们自定义的。这呢,我写个负数是吧,哎,比如说负四啊,OK一下。Run一下。哎,这就输入负数了,行,那么这几种情况呢,我们就都演示了一下啊,那么这道题的话呢,你看为什么说它具备这个综合性呢?首先呢,我们提到异常处理的两种方式,Rose check开那都有。这呢是我们这一章的这个重点啊,然后呢,呃,其次呢,就是常见的异常类型呢,你看也见到了啊,再者的话呢,我们在这里边儿呢,使用死肉手动抛异常了,而且抛的还是个自定义的。整个呢,我们这一章呢,讲的几个知识点呢,其实全都有体现,但实际开发的时候呢,其实我们针对于这几种啊。咱们提到了运营时呢,就都没必要呢去开始了,只针对这个呢,是非运营时的,我们采取处理。
39:06
哎,注意一下这个实际场景就行,好,那整个咱们这一章的这个知识点呢,就算是告一段落了。后续的话呢,咱们在接下来的这个章节当中啊,其实呢,针对有异常的一些方法是吧,我们就要去处理了,到时候相当于还会去用啊,所以有同学呢,觉得说诶我理解稍微差点意思,没关系,后边还要用,通过不断去使用呢,其实大家呢发现呢,也就这么回事啊。
我来说两句