错误抛出机制:
把可能出现异常的代码写在try{}里,使用catch(){}设置一些异常陷阱来捕获异常。例如:
没有异常处理时异常的抛出机制:
为什么出现异常会在控制台上显示打印红色的异常呢?这是因为其实main方法外面还有一个try catch,try包围住main方法,catch捕捉异常,所以在main方法里没有写try catch来捕获出现的异常,这个异常就会往外抛到包围main方法的这个try catch,然后就会在控制台上打印出现的异常。
异常抛出机制过程:
异常家族:
Thrwable是所有异常类的最高父类,它的两个子类Error(虚拟机报的异常)和Exception(代码上报出的异常),只要是继承这两个类的都强制要写try catch不然就会直接报语法错误。Exception下还有一个RuntimeException子类(常见异常or不是很重要的异常),继承这个类的则不会要求写try catch,因为对开发熟练的工程师一般可以避免出现这种异常,不然所有异常都要求写try catch的话,这样写一段代码就要写一个try catch会显得烦赘。
通用异常陷阱:
异常对象里还有通用的捕获陷阱,一般有其他陷阱的情况下通用陷阱要写在最后面,写在前面的话全部异常都会进入这个陷阱了,开发中最好少写通用陷阱,因为发生错误了不知道具体是什么错误。
try catch里代码执行流程:
因为在第14行代码出现类型转换错误,而且没有相对应的异常捕获陷阱,这个异常就会往外抛,抛到main方法外的try catch里。因为这个异常没有被处理所以下面的代码一句都不会执行的,所以只会打印1 2然后打印异常。
因为在第16行代码出现内存溢出错误,然后就进入相对应的异常捕获陷阱里,异常被处理了后面的代码就会继续执行,所以打印 1 2 3 4 7 8。这种情况要看虚拟机分配的内存,如果是分配的少于2G就只会打印1 2 3 7 8,如果分配的少于1G就只会打印 1 2 7 8。
try catch可以进行嵌套使用,因为在第12行代码出现数组下标越界错误,而且没有相对应的异常捕获陷阱,这个异常就会往外抛,抛到main方法外的try catch里,被打印出来。因为这个异常没有被处理所以外层try catch下面的代码一句都不会执行的。
没有出现类型转换错误的原因是因为,s的值是null没有内存里面是空的,所以在转换的时候不明确s是什么类型,所以就会转换成功没有出现错误,一旦里面有值即便是””也会报错。
本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1974350,如需转载请自行联系原作者