1.JVM默认的处理方式
a.把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
运行结果如下:
b.程序停止执行,异常下面的代码不会再执行了
2.try...catch捕获异常(自己处理,捕获异常)
a.格式:
b.目的:当代码出现异常时,可以让程序继续执行下去。
c.示例如下:
由于产生异常,此时代码无法继续执行
如何改变呢?
使用try...catch处理异常
运行结果如下所示:
仔细分析红色箭头的内容
System.out.println(arr[10]);
1.此处出现了异常,程序就会在这里创建一个ArrayIndexOut0fBoundsException对象
2.new ArrayIndexOutOfBoundsException ();
3.拿着这个对象到 catch 的小括号中对比,看括号中的变量是否可以接收这个对象
4.如果能被接收,就表示该异常就被捕获(抓住),执行 catch 里面对应的代码
5.当 catch 里面所有的代码执行完毕,继续执行 try ... catch 体系下面的其他代码
3.捕获异常的灵魂四问:
灵魂一问:如果 try 中没有遇到问题,怎么执行?
答:会把try里面所有的代码全部执行完毕,不会执行catch里面的代码
注意只有当出现异常才会执行catch里面的代码
灵魂二问:如果 try 中可能会遇到多个问题,怎么执行?
答:会写多个catch与之对应。
细节:如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下面。
拓展:以上是JDK7以前的处理方式。
在JDK7以后我们可以同时捕获多个异常,中间用 “ | ” 进行隔开,
表示如果出现A异常或者B异常的话,采取同一种处理方案。
灵魂三问:如果 try 中遇到的问题没有被捕获,怎么执行?
相当于try...catch的代码白写了,最终还是会交给虚拟进行处理
灵魂四问:如果 try 中遇到了问题,那么 try 下面的其他代码还会执行吗?
答:不会执行,下面的代码就不执行,直接跳转到对相应的catch 当中,执行catch里面的语句体
但是如果没有对应的catch与之匹配,那么还是会交给虚拟机处理。