前面扯过一篇浅谈面向对象与女娲造人,今儿我接着扯……
在我的理解中,所谓的异常机制也就是让程序在出现某些错误的情况下还能继续执行完
如同两个人在恋爱,虽然出现各种问题,但还是希望将来能继续走下去
在java的异常结构中有一个顶级父类叫做Throwable,这个父类具有两个子类,分别是:
Error
Exception
为了便于初学者能更好的理解异常机制,我姑且先列举一些不恰当的例子:
可以这样理解Error1.你某天很舒服的坐在沙发上看电视,你爸突然把你拉到书房里语重心长的对你说:
“你和她不能在一起,她其实是你失散多年的亲妹妹”(神马感觉,心里一万只草泥马在奔跑对不对?)
2.终于能在一起了,尼玛突然在她房间抽屉发现当年变性手术的费用单(这次不只一万只了)。
两个例子都有一个共同点,就是你不会和她继续在一起了,你们的结合会是一种Error(错误),是硬伤!!!
对于这种根本无法解决或无法隐忍的情况就是所谓的Error,懂了吧
而在java语言中,Error则是代表硬件,jvm或代码本身存在问题
虽然你对于无法处理这一情况很不甘心,但你还是会一遍遍检查配置和你的代码,以期望能够解决
再看看Exception
把致命问题Error排除了(她是个好女孩),现在你和她能够在一起(程序能够继续执行)又多了一份希望
但是,你仍然不能掉以轻心
两个人相处,难免会产生一些不好的情绪,一旦你没能处理好,那么两个人的感情还是over(程序无法继续执行)
在这里,Exception就是那些你要处理的情绪问题的总称
为什么是总称呢?因为大脑产生的情绪(异常)非常复杂,还可细分为各种情绪(纠结体)……
我们判断一个人的情绪是靠经验,比如产生这种坏情绪后,她有哪些行为和反映
在java里,Exception是一个父类,它还有很多的子类(也就是各种坏情绪的封装)
你看,就这么简单,我们就理解了整个java的异常体系
Throwable下的两个已知子类,Error和Exception
Exception下的各个细分的异常
既然我们了解了java的异常体系,也知道了Error是无法处理的,那么我们能做的就是针对Exception的操作了
也就是在恋爱过程中,我们对她坏情绪的处理,好让两个人的感情能够继续……
那么如何操作呢?
很简单,你只需要进行判断和测试,确认她的行为是否符合你经验中她这一坏情绪的反映,然后做出处理就行了
相信你一定知道基本的除数为0异常,这里就不再写了,任何一本基础书都有
为了避免针对性的代码造成不好理解,我们下面都写伪码
实例1:典型的try...catch结构
//女友为什么是public?因为谁都能追 public class GirlFriend { //还记得吗?你们的故事就是从这开始的 public static void main(String[] args) { //我们用try包裹的代码来判断和测试她不稳定的坏情绪 try { 她小情绪的反映 她小情绪的行为 她小情绪的眼神 …… //在实际中则是Exception e,你肯定知道 //为什么有个e对象,都说了异常也是一种类 //所谓的catch就是捉到她坏情绪的原因,并进行处理 } catch (工作累了异常 e) { //打印异常信息,你可以认为是她在诉说原因 //实际中我们要结合场景来处理 e.printStackTrace(); } } }
你看,这样我们就能有针对性的处理单个异常了,在try里面测试
catch里面进行处理
当然,有时候一个人情绪不好是由于多种原因,那么你只能小心翼翼的根据经验
来捕捉更多的异常(坏情绪的封装对象),此时你也就需要多条catch语句了
实例2:复合的catch语句try { ...... } catch (工作累了异常 e) { 捶背 } catch (口渴了异常 e) { 倒水 } catch (被鄙视了异常 e) { 安慰 //这里的Exception是所有坏情绪的父类 } catch (Exception e) { 各种安慰 各种献殷勤 各种倾听 }
为什么所有坏情绪对象(Exception)要放到最后捕捉呢?
很好理解,当你在无法确定她到底是累了,渴了还是怎么地产生的坏情绪时
你便可以认为,反正她就是特么的很烦,想闹脾气,你得处理!!!(不然就over)
好吧,你看到了,不论是讨好女友还是处理异常,都是一件相当不爽的事
下面我们来看看一个很简单,很朴实的关键字finally
实例3:finally语句的使用try { ...... } catch (Exception e) { //Todo } finally { 不管你特么心情好不好 反正都是老子洗碗!!! 靠…… }
看,finally好用吧,你可以这样理解
是男人就应该默默的承担,不管有没有异常,我都执行
在java中,finally最常用的场合就是最后关闭io流对象了,可见我写的另一篇笔记
至此,我们已经讲完了java异常的基础操作
新手可能会问,咦?throws和throw两大关键字去哪儿了
别急,咋慢慢来,去端杯茶缓缓……
对于throws在java中的意思是,让调用处去处理这一异常
就比如说她们受了一顿闷气,本来你不说还没什么,你一说她们就忍不住了
把所有的火都对你发,谁让你要去惹她们的?
自己可以处理却不处理,俺们就叫做throws,一般在方法后面使用
实例4:throws的用法public void 降低愤怒() throws 愤怒的异常 { /*你看,在这里明明可以try...catch的 但是却没有,把异常给抛到了调用处*/ ...... //这是处理方法,此处省略N行代码 }
本来在降低愤怒()这一方法中可以try...catch的,但是不想,要留给招惹它的人
那就用throws吧,谁惹我谁遭殃
其实,女人是一种很奇怪的动物,她们有时候会假装自己生气
从而达到让你哄的目的,典型的欠try有木有……
那么,这个时候throw就发挥了作用
在java中,throw表示人为的抛出一个异常
实例5:throw的用法public void throwMethod() throws Exception { throw new 发嗲了异常("干爹,你来~~") }
这里在throwMethod方法中我们人为抛出了一个发嗲了异常,然后给调用处try
至于catch部分的内容,你们自己看着办……(尼玛,我才19怎么就那么邪恶了)
再来,我们在翻看API文档的时候也许会发现类似下面的方法
它们明明抛出了异常,而我们在使用中却没有try,这是怎么回事?
这叫做RuntimeException,也就是运行时异常,它们可try可不try
因为一旦产生这种异常就说明你的代码可能存在问题,比如数组下标越界等
此时,try...catch意义不大,检查和修改源码才是最佳选择
最后来说说自定义异常,自定义异常一般用的不是很多,可以这样理解:
有时候你的女友乱发脾气,完全不按套路出牌,令你不知所措,以前的经验在此也似乎失效
那么,此时我们就可以定义一个自定义异常来描述这种情况
public class CustomException extends Exception { public CustomException(String msg) { super(msg); } }
如果想测试的话,可以throw一个新的CustomException对象,构造方法中加入信息就可以了
然后你懂的,try...catch处理
很简单,就没必要演示了