java 了解异常和自定义异常

异常简单来说是:程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常;

异常都种多样,但它也和别的类一样一个老祖宗,后面就有许多分支;(图片转载)

java 了解异常和自定义异常

错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。

异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。

而其中我们又可以按要求把异常分为两类非检查异常(也叫运行时异常)和检查异常:

运行时异常顾名思义它就是在程序运行时才报出异常,使程序无法继续运行,如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等;

 

而检查性异常是在运行之前,也就是在你写程序的时候报的异常,如果是报检查性异常,那就要先解决这个异常才能进行程序的运行,强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过;

 

try…catch是用来抓捕异常;

而说到try…catch,finally这个类经常会被用到,它的作用是在try…catch捕获异常时,程序就会被强制停止运行,而finally可以在出现异常时继续运行里面的代码块,如在使用IO流的时候可以用来关闭流,因为使用流的时候如果出现问题,流是无法进行关闭的,这个时候就可以用finally来关闭流,因此finally块通常用来做资源释放操作:关闭文件,关闭数据库连接等等;

要注意的地方:

1、finally块没有处理异常的能力。处理异常的只能是catch块。

2、在同一try…catch…finally块中 ,如果try中抛出异常,且有匹配的catch块,则先执行catch块,再执行finally块。如果没有catch块匹配,则先执行finally,然后去外面的调用者中寻找合适的catch块。

throws声明:如果一个方法内部的代码会抛出检查异常(checked exception),而方法自己又没有完全处理掉,则要保证你必须在方法的签名上使用throws关键字声明这些可能抛出的异常,否则编译不通过。

 

异常比较有意思的是异常的链化:

在一些大型的,模块化的软件开发中,一旦一个地方发生异常,则如骨牌效应一样,将导致一连串的异常。假设B模块完成自己的逻辑需要调用A模块的方法,如果A模块发生异常,则B也将不能完成而发生异常,但是B在抛出异常时,会将A的异常信息掩盖掉,这将使得异常的根源信息丢失。异常的链化可以将多个模块的异常串联起来,使得异常信息不会丢失;(简单来说就是一层一层的报异常,那个地方关联到就报到哪里,一直到最后关联到它地方),优点是使得异常信息不会丢失,缺点也很明显,就是一个问题他可能会报几百甚至几千的错误,怕会吓死你;

 

下面来说一下自定义异常:

    自定义就是按照自己的想法创建一个异常,下面我先说步骤了解一下:

  1. 自定义异常—>使程序异常—>捕获异常;

java 了解异常和自定义异常

先定义一个异常类;我这里简单的抛出一个自定义异常;

 

 

java 了解异常和自定义异常

     这个例子是应用老师的例子,比较简单清晰;

java 了解异常和自定义异常

     从图片也可以看到报出的异常;

 

前面有说到异常的链化我就在这个例子的基础上改一下让大家更清楚的了解一下链化是什么意思

java 了解异常和自定义异常

 

我在前面的例子上加了多一个调用方法,可以清楚的看到这个异常比前面的多了一行,在行中可以看到调用的方法名称,一层接一层,就是说谁调用到它,谁就报错;