声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。
异常处理:
可以挖很多个陷阱,但是不要都是一样的陷阱,要不然没有意义。
一旦发生异常,产生一个异常对象,立即终止代码向下执行,寻找陷进处理异常,如果当前陷阱无法接受异常对象,就会向外抛,一直抛给能处理异常的陷阱。
异常捕获:
异常捕获是一种特殊的处理机制,跟if else不一样。If else是通过一个条件判断来进行分支,异常一旦发生就终止代码运行,马上去找捕获区(处理者)进行相应的处理。
捕获语法: try{
//可能会出错的代码
}catch(陷阱类型){
处理
}
例题1:打印结果为1、2、3、5、6.
S.toString();出现了异常直接跳到了NullPointerException e 陷阱中,把4号的代码终止了,因为s.toString 出现了出错直接抛给了陷阱。进入陷阱后进行了相应的处理,代码再往下走。
例题2:
打印结果:1、2、5、7。
执行过程:从main方法开始,打印了“1”、“2”,发生了一个不能被0整除的错误,抛给了ArithmeticException e陷阱,打印了“5”、“7”。
例题3:
打印结果:1、2、1、3、6、7.
执行过程:先打印1,然后打印2, 1/1=1, 打印1,接着打印3,最后申请一个数组,数组长度为1,发生了数组下标越界错误,走进了(ArrayIndexOutOfBoundsException e)陷阱,走进陷进后打印了6,最后打印了7。
例题4:
打印结果:1、2、3。
执行过程:先打印了1、2、3,然后出现了下标越界错误,代码中并没有挖下标越界错误的陷阱,它是无法执行的。Java的原理:异常一旦抛出,就会疯狂的找对应异常的陷阱,找不着就往外面找,终止外面的代码执行,外面在找不着再往最外面找。会导致一直终止代码。
例题5:先执行main方法,调用了m2(); ,m2调用了m1,m1调用了m,m出现了下标越界异常,m方法中没有处理数组越界的陷阱,所以无法处理数组越界异常。无法处理就向外抛,抛给了被调用者,m1没有处理者,又抛给了m2,m2又抛给了main方法,main方法中又相应的陷阱处理,跳到了数组越界处理的陷阱中,往下执行。(如果main方法没有相应的陷阱话,就会往外抛)
通用陷阱:
抛异常都是对象形式,对象找陷阱时候的是使用instanceof 能通过的就可以。
通用陷阱就是写他们的父类,用父类做陷阱类型,可以接受更多异常。
异常家族:Object--------Throwable
1.Exepion(程序抛出的异常) :RuntimeException(运行时异常)
2.Error (虚拟机抛出的错误)
Exepion:是一个比较严重的错误,要不然就写个try()catch{}伺候着,不然就向外抛出。 RuntimeException:这种错误是操作时的错误,这种错误一般认为,技术好有经验的话都可以避免。所以没有必要强制写try()catch{}。
通用陷阱要挖在最后,不然就独有一个。(要不然没有意义)
finally:最终执行块。
写在最后。
出现异常,或者不出现异常都会执行finally最终执行块。
写法:
1.try()[
}finally{
}
2.try{
}catch(){
}catch(){
}finally{
}
例题:
打印结果:1、2、4。
执行过程:先执行打印1、2,然后出现不能被0整除异常,往外抛,往外抛之前要执行最终执行块。
例题2:
打印结果:
执行过程:先执行打印1、2,然后生发一个数组越界错误,执行4,然后抛到6.因为try 的结构结束了,里面的代码执行完了。然后异常抛给了6,打印了6,接着打印7、8.