java中有关异常的使用以及原理分析
笔者水平有限有关原理部分存在深入不够,并且在用法部分也是与项目相关,存在着不够全面的问题。
1.0 异常分类
异常通常分为两类:(1)一类是Error,通常指的是虚拟机错误。一般来讲分成两种:outofmemoery,stackoverflowerror。这两种错误都是在运行时期,由虚拟机抛出。
(2)另一类则是异常,而异常则又分为运行时期异常以及检查异常(我个人为理解为编译期异常)。1.0.1 RuntimeException 有哪几种一般来讲,运行时期的异常分为8种:(1)非法传参异常(2)数组下标越界异常(3)数组下标为负数异常(4)算数运算异常(5)数字格式异常(6)空指针引用异常(NullPointerException )1.1 异常捕获机制异常是如何被捕获的呢?原因是监控区域的存在,它是一段可能发生异常的代码,并且后面跟着处理这些异常的代码。当异常被抛出时,异常处理机制负责搜寻参数与异常类型相匹配的第一个处理程序。然后进入catch子句执行,此时则认为异常得到了处理。(在try块的内部,许多不同的方法可能产生相同类型的异常,只需要提供一个针对此类型的异常处理程序)。
(2)用法部分
1. 针对不同的异常进行捕获,从1.1中的异常捕获机制即可知道,异常首先是寻找与第一个catch匹配的异常处理程序,若不中则会进入第二个catch。。。
public void tryTest(){ try { t(); }catch (Exception ex){ System.out.println("外层try开始工作"); System.out.println("内层异常被捕获!"); } } private void t(){ try { int i = 0; int a= 100; int b = a / i; }catch (Exception ex){ System.out.println("进入内层异常!"); //throw new RuntimeException("除法操作发生异常!"); } }
上面代码的运行结果为:
进入内层异常
但倘若在内层try-catch中中重新抛出异常,那么会被外层try-catch捕获。代码如下:
public void tryTest(){ try { t(); }catch (Exception ex){ System.out.println("外层try开始工作"); System.out.println("内层异常被捕获!" + ex.getMessage()); } } private void t(){ try { int i = 0; int a= 100; int b = a / i; }catch (Exception ex){ System.out.println("进入内层异常!"); throw new RuntimeException("除法操作发生异常!"); } }
运行结果如下:
进入内层异常! 外层try开始工作 内层异常被捕获!除法操作发生异常!
在项目中,一段代码中有着不同的函数调用,准备对不同的函数调用所发生的异常进行捕获同时进行采取不同的异常处理机制。面对这种情形应该定制不同的异常类型,并且对不同的异常类型进行捕获,同时在catch块中采取不同的处理策略,是往上继续抛出异常还是处理异常的,而不应该采用多个嵌套tay-catch对不同的异常分别进行捕获。
需要注意的是:在捕获异常时,应该根据继承的层级,首先将子类放在最前面,然后通常在最后捕获Exception类。
1.3 关于自定义异常
1.3.1 直接继承Exception即可
1.3.2 通过Throwable,Exception也是继承的Throwable。
(具体的实现方式可以搜寻相关博客)