00:00
接着呢,我们来看第二个新的性,称为呢,叫非常实用的non po exception,非常实用的控制异常,在这个前面呢,加了一个修饰叫做实用,这个呢不是我加的,是在这个官方呢,就提到这个词叫做helpful,那么为什么称为叫实用呢?哎,我们这里提到说该特性啊,改进了控制人异常的一个可读性。能够更准确的给出闹变量的一个信息,就是这个闹呢,到底是谁报出来的,就这样一个情况,那么大家呢,现在看到他呢,可能不太清楚,因为咱们还没有写代码啊,那么在写代码之前呢,希望呢,这个我稍微的多唠叨几句,关于这个控制人的问题,因为他这个问题由来已久,包括呢,我们对这个周边呢,也有一个这个这个说明,那首先呢,这里提到一个说叫no啊,何错之有?这个no啊,它本身其实也是个发明,他的发明者呢,就是下边这个老爷子,叫做Tony霍。啊,这个老爷子呢,在1965年的时候呢,发明了一门这个编程语言,在这个编程语言当中就用了这个闹,这其实也是一个隐文,就是一个发明了啊,为什么引入这个闹呢?就是当我们具体去调用的这个结构本身这个变量没有被赋一个具体的对象的时候呢,赋一个值的时候呢,我们就称为是个闹,应该说这种想法呢,非常的简单直接,那就把这个呢概念一直在沿用,包括呢,咱们后续的是不是所有的编程语言呢,都使用了这样一个概念,对吧。
01:15
哎,他这在2009年说了这样的一段话,说I call it my billion Dollar mistake说呀,我犯了一个价值10亿美元的错误。这个他提到叫10亿美元的错误,为什么呢?就是他在六五年引入了这样一个闹啊,这里就提到了在这个未来的就是六五年之后的50多年的这个时间当中,数以百万计的成员为了解决这个控制异常哈,这个付出了极大的努力,包括咱们说的这个Java语言也是对吧,那Java语言的话呢,咱们也出现了这个控制人的问题。那咱们往好里说呢,说Java语言是为了兼容咱们之前的这些编程语言,那往不好里说呢,就是同样的就是Java呢,是不是也是做了一个偷懒啊,仅仅是因为呢,这样实现起来呢,更加简洁。但是Java这样来做,会导致很很多后续的一些问题啊,在这呢,我也列出来了这个Java巴,这个实战当中,这本书里边提到了这样的一些问题,大家看一看你是不是有共鸣。
02:11
对于咱们Java成员来讲,没有人不可能在编程语言当中,这个编程这个当中出现这个没有出现过这个控制异常的,对吧,他是咱们Java开发当中最常见的一个最典型的一个异常,它呢使得我们这个代码呢膨胀啊,我们这呢写一个异服操作,说判断性这个变量呢,它是不是个闹。那它如果是闹呢,那就直接就跳出了啊,或者你要不是闹的情况下呢,我们再去通过它呢,调用它的一些属性啊,或者方法等等的,对吧,所以这块我们都要加一些判断,使得我们这个代码呢进行了一些膨胀啊,那其次的话呢,如果我们在通过对象。啊,通过对象的点属性点方法的时候呢,每次我们都需要提前判断一下这个变量它是不是个no,那么是不是就逐渐的深层次的去嵌套啊,导致我们这个代码呢,这个可读性糟糕透顶。下边呢,又提到说它本身又是毫无意义的,因为它就是不代表任何语义嘛,对吧,那我们是对这种缺失的这种值的一个建模,用这个闹来表示呢,就很崩溃是吧,本身毫无意义啊。
03:08
那下边那个重点想强调一下,就是它破坏了我们Java的一个设计哲学,哎,这话怎么讲呢,咱们在学习Java的时候呢,大家肯定听说过啊,说Java呢,是建立在原有的C和C加的基础之上,典型的一个点呢,就是去除了原有C和C加加当中的指针,对吧,那Java中呢,我们是引用的方式呢,去来调用这个具体结构的一些结构,一些方法或者是属性的。那么当我们未给这个引用,比如我们称为叫P引用,没有给他具体附一个实体对象的时候呢,我们再去调用P当中的这些属性或者方法,发现就报控制帧了,那么又暴暴露给成员呢,叫做指针这样一个概念。咱们尽可能避免让程序员感受到这个指针这个概念的存在,但是呢,你这块又爆了一个控制帧,这个问题呢没有很好的隐蔽起来,所以呢就破坏了Java的这个设计哲学。OK,这是这个意思,然后下一个呢,说他在咱们Java这个类型系统上划开了一个口子。
04:02
怎么讲,咱们知道Java呢,是不是强类型的语言,那我们对应的这个变量,这呢是一个具体的变量一个值,它呢,诶要么呢,就是付给它本身new这个对象呢,对应的这个类型。比如我们这块用一个,咱们说叫一个student,一个学生是吧,那我就付给这个student类型的一个变量,这是没有问题的,那同时呢,咱们是不是也可以付给他的一个负类类型,比如我们叫person类型,那即使呢,你付给person类型,咱们刚才呢,讲了一个新特性叫instance of,通过instance of判断的时候呢,咱也知道你这个变量的实体就是一个student,对吧?所以呢,它不会隐含我们本身这个变量类型的,但是这个now的话呢,大家会发现就有问题了,你说这个now我们付给一个这个student类型,那我又把它付给person类型,那咱是不是也不知道你这个now最初是这个这个student类型的,对吧。哎,相当于呢,就是这个类型这块呢,就很模糊啊,因为now本身呢,它就不属于任何一个类型。咱们刚才呢,进行判断的时候呢,这不也发现这样个情况了吗,所以这块呢,就是在类型匹配啊,类型这个强类型语言这块这块。
05:02
啊,在Java这块呢,又有一个问题。啊,上述呢,就是我们归结的这样的几个问题啊,那么基于这些问题呢,咱们看一下其他的这个编程语言,他们是怎么在后续的这个新特性的这个过程当中去解决这个控制人的问题的。首先呢,我们提到的叫G这个语言,它引入了一个叫安全导航操作符。那就是这样的一个结构,呃,当我们这个person变量对应的这个对象实体存在的话呢,那就直接返回这个person本身,如果呢,他要是为no,那我们就返回它的下一个变量,下个变量还未闹呢,接着往后延伸,通过这样一个方式呢,我们尽可能的去避免出现这个叫控制人的这个异常。OK对吧,好,这是说的它,然后另外呢,提到了叫哈carere和SC这样两个语言,在health carere这个语言当中提到了一个叫maybe的一个类型,SC里边呢有个叫option里边呢是一个AA呢,就是具体某一个类型的一个变量值了,那咱们其实就可以把这个A呢看成它这个,把这个option呢看成是A这个类型的一个容器了,那如果说A这个变量呢,它不为空,那就是输出这个A。
06:04
那如果说他要围控呢,我们就对应的是个闹啊这样的类型。OK,提到了这样一个容器叫option,咱们Java呢,其实就参照了这个SKY里边这个option提到了一个叫optional一个结构啊,下边呢提到了一个coly,诶Co这个语言呢,诶我觉得这个设计还是也挺好的啊,它呢会给这个具体的变量A,嗯,就是区分为它是可以容纳闹的还是不能容纳闹的,如果呢,它不能容燃闹,比如这个A呢,是一个string复制为ABC,如果呢,你要给它复制为一个nu的时候呢,编译就报错了,因为呢,你不允许它为空。真的就避免了控制异常了,对吧,那如果说你要是允许它为空呢,我们在类型后面加一个问号,那下边你就可以复制为空。哎,通过这样呢,我们做了个区分,能够在编译的时候呢,就把这个控制人的问题呢,给我们暴露出来挺好的是吧,那那咱们张二呢,是如何解决这个控制人的异常的呢?这呢提到了两个思路,第一个呢,就是我们JAVA8中引入了叫optional。参照了我们SC当中的一个option。
07:01
但是这块呢,我们不想在这里边去花屏幕来讲解这个optional,大家有兴趣的话呢,你再学习一下这个JAVA8中这个optional的这个新特性里边呢,提供了一些方法,对吧?嗯,那么在实际开发当中啊,结合我个人的经验呢,会发现这个实际上我们这个option呢,在string API当中呢,有一些体现,当我们呢,去调用相关的方法,它的返回值就是option中类型的,所以这块呢,大家也要熟悉一下啊。那么另外一个啊,其实这块option呢,我觉得呢,呃,只是呢,我们尽可能去规避这个控制人的问题,但是呢,实际开发当中,大家好像用的optional也比较有限,对吧,那这呢,我们就干脆提供一个更加实用的功能,也就是我们现在讲到的这个新特性,这个新特性呢,你看这呢,用了一个叫help这样一个概念,它呢能够更好的提示咱们在哪个位置出现了控制帧。好,下面呢,我们写代码了,来给大家演示。这个代码本身呢并不复杂,所以提前呢我就把它展示出来了,稍微呢带着大家看一下。这儿呢,我创建个类叫做bank银行,银行里边有这个客户概算方法,包括过到器,这上就不能多说了,那银行里边有客户,客户里边有账户,相应的一些概算方法,包括过到期都提供好,账户里边有余额,这个balance呢,就是咱们这个叫余额。
08:15
OK,那么现在呢,我们想做的事儿呢,就是创建这个银行客户账户,账户里边也给大家提供余额,然后这个取相应的一些这个钱,对吧?好,我们来看一下这个代码该怎么写,首先的话呢,我们需要去创建一个bank。在bank里边,或者就使用这个匿名对象了,咱们呢去new一个卡,卡里边呢,我们去new一个count,那count里边我们比如说放1000块钱。OK,没问题对吧?那么拿着这个bank呢,我们去get一个customer.get一个count点,做一个with照取钱,比如200块钱。OK,很清楚对吧,那么在这个微照这块呢里边,如果呢,你要是取款成功了,我们就有这样一个输出,没有取款成功,我们有这样的一个,呃,说取款失败这样的一个操作,比如说我这里边操作的是200,那很显然呢,是能够取钱成功的,我们做做执行。
09:05
没问题啊,成功取款200块钱,这呢没有出现控制异常,那我们下面呢,给大家造一个控制异常,比如我们把这个bank,嗯,把这个代码呢,重新再复制一份,上面这个我们注释掉。在这里边我们不去这个count。那么大家知道呢,这个结果肯定是有控制针了,对吧,我们执行一下。那就报了个控制人,在我们这个第16行出现的。注意现在呢,我使用的是不是我们这个GDK14了,已经。已经使用的是我们这个14了,那在使用14的情况下呢,好像诶这也没看到有什么区别对吧?注意呢,我们要想在14当中体现这个新特性的应用啊,大家需要加上这样一个参数。这个参数的意思呢,就是显示一下我们在异常信息当中的一些具体的代码细节。OK,把这个信息呢,我们加到哪呢?这个我给大家啊,已经写到这了是吧,这个在我们这个run当中,在idea当中,我们是在这加的啊有一个d configurations点开这呢,是关于我们这个结构的一个VM的options,就是我们这个参数在运行的时候呢,把这个参数呢,给它加上OK。
10:08
然后接下来我们再去执行刚才这个代码。好,这就出来了,大家看一下说呢,我们当前这个main方法的这个线程当中出现了控制异常,说不能够去调用,调用什么呀,我们account当中这个叫with这个方法,就我们想取钱嘛,主要原因呢,是因为我们这个customer去调get count的时候呢,返回这个no。哎,这个大家会发现,是不是这时候呢,就清楚多了。我把这个这句话啊,咱们C一下。大家到这。这个大家呢,应该也看到知道这块想强调的问题是什么啊,就是当我们在这块呢,去调用这个方法的时候呢,这里边有好几个点,那么每一个点的位置呢,是不是它的调用者都有可能是一个空的呀。那么我们这个真正要出现控制异常的时候呢,诶这个刚才我们在加这个参数之前呢,发现他就报我们这一行出现控制呢,到底是哪一行哪一个位置出现的,其实我们并不清楚。
11:07
那当我们加上这样的一个参数之后,它能够告诉我们,就是因为在你调这个with方法之前的这个结构呢,它是一个no,那大家呢,去改代码的时候呢,是不是就非常方便了。这就是我们刚才提到的这样的一句话。说呢增强了我们这个可读性,能够更准确的给出no变量的一个信息,这呢就是我们说的这个新特性,当然呢,需要加上这样一个这个参数,那这个参数呢,在我们这个JDK10还是需要我们来添加的,那可能在后续的JDK15当中就会设置为是一个默认的参数,大家以后呢,就直接呢去运行,呃,自动的就会报给我们报出来,说到底是哪一个具体的方法调用的时候呢,出现的这个问题了。哎,后续一定会设置成是一个默认的情况的啊这呢,就我们说的一个好处,那么多说一句我们这个新特性有什么弊端呢。有什么弊端呢?那其实呢,你看啊,我们这个异常信息当中,是不是暴露了我们具体出现控制人这个问题,问题的这个方法和这个变量了,对吧,那实际上呢,也有可能会存在一定的安全问题,或者叫存在安全的风险。
12:11
啊,这呢就是我们要强调的一个点,就是也会存在一定的弊端,但是呢,相较于它的弊端来讲,它的优点呢,是不是更明显,OK,那么大家在以后开发当中,其实呢,现在还需要你加一下,那以后的话呢,这个会在后续的版本中不用加了,我们这时候呢,直接用就行,在代码上呢,就没有任何的变化了,对吧?诶就方便我们的一个可读性。好,这呢就是我们说第二个新特性。
我来说两句