一、throwable的正常语意
throwable是一个正常的英文单词,该英文单词翻译成中文的语意是异常的意思,也表示抛出、没有测试以及可抛出异常的中文意思。
像这种英文单词其实在不同的语境中扮演着不同的角色都有多重含义,就像是spring这个单词,原意是春天的意思,也可以表示泉水,在java程序中又表示是一种框架,throwable也有多层的意思。
throwable跟不同的短语组合在一起就有不同的语境,如果是throwable type 该短语意思就是抛出了相应的异常,而如果组合成Throwable Rocks 这个短语的话就是是扔石头抛掷石头的含义。
扩展阅读:
二、throwable在java程序的语境中是什么意思
在Java语言中,throwable表示Java程序中的一个异常体系,它存在于JDK的lang包中,包名全称是java.lang.throwable。
throwable是该异常体体系中的最底层的接口,被称作根类是所有实现异常子类的父类和超类,throwable的实现类中有错误和异常两个分支,错误的分支叫error,异常的分支叫exception。
下面我们贴一张throwable类与其此类的结构体系图,就可以清晰的看出它在Java程序中的继承与实现关系。
扩展阅读:
三、java中throwable异常类理解
1、异常的定义
Java语言中一切程序运行的非正常情况都被叫做异常,就连错误也是异常的一种,错误一般指代码编写错误或者编程人员逻辑不严谨的错误。
而错误又分编译期错误和运行期错误,编译期错误是编写程序时代码单词写的有误和逻辑错误,像eclipse这种编辑器会提示编译期错误信息,这种情况程序都不会编译通过也无法运行,需要改正错误代码之后方能编译通过,而运行时的错误是能够通过编辑器的编译,也不会提前提示错误,而是在运行时出现了的错误。
理论上来说,运行时的错误是有一部分是可预料的,像这种可预料的错误Java程序就建议使用异常体系来捕获和处理以增加程序的健壮性。
异常体系就是针对这些可能出现的运行时错误,提前做出判断进行捕获和排除这种错误的可能性,保证程序良好的运行。
2、异常的分类
编译期异常
Exception异常下的分支又分为编译期异常和运行时异常,编译器异常全名叫IOException,运行时异常全名叫RuntimeException。
编译期异常就是eclipse等开发工具进行编译的时候提示的异常信息,eclipse要求必须对编译期异常进行处理改正程序才能编译通过,这是强制性的必须改正和处理。
运行时异常
运行时异常就和eclipse等开发工具没有关系了,它已经编译通过了,而是程序运行时由于程序的不确定性抛出的异常信息,比如常见的空指针异常、下标越界异常、数组越界异常以及除数不能为零异常,这种异常需要程序人员自行捕获但不是强制性的,不捕获会影响程序的正常运行,会导致程序经常出现bug。
扩展阅读:
3、throwable下的异常如何捕获
try catch()finally捕获异常机制
上图中的代码是一段使用try catch finally捕获异常的一个经典案例,try{}代码块中包起来的代码是可能会出现异常的代码,catch内是捕获到的异常,在catch内进行处理或打印throwable异常提示信息。
finally这个代码,写也行不写也行,由编程人员自主选择,表示异常处理完成之后必须要执行finally中的代码。
catch括号里面的参数就是需要捕获的异常所属的异常类型,如果括号里面参数声明的的异常类型跟我们所捕获的异常不是一个类型的话怎么办呢?这种情况下可以写多个catch捕获多种类型的异常,排除一切异常的可能性,详见下图中的代码。
throws抛异常机制
throws是Java中定义的一个抛出异常的关键字,此种用法一般只用在声明的接口中,在接口方法后面加上该关键字,表示自己不处理异常,由调用者自己处理或者是扔给虚拟机自行处理,一般在Java程序中写接口都会加这个关键字,由调用者或者是接口的实现类中处理异常。
throw和自定义异常机制
throw也是Java中定义的一个关键字,一般会配合throws和自定义异常进行使用,Java中虽然定义了很多类型的异常,但是不可能包罗万象的把所有异常类型都给你整理出来,因此它扩展了一个程序人员可以自行定义的自定义异常机制。
我们可以自己编写一个异常类,然后根据项目需求业务需求抛出自定义异常信息,一般throw关键字后面就跟着new一个自定义异常的实例对象,具体详见下图中的代码。
4、捕获异常时应该捕获throwable还是其子类?
很多程序员虽然会使用Java中的异常机制了,但其实不明白到底捕获的是throwable还是其子类的异常信息,在这里我们统一说明一下。
首先,throwable包括exception和error,如果直接捕获throwable的话会将exception和error错误信息全部捕捉到,也就是说捕捉的范围更大,但是人家JDK中明确声明过error是一种严重的错误,这种严重错误是内部的问题而不能当做异常捕获,详见下图的说明。
因此程序中捕获的异常都是exception其下的子类的异常信息,捕获exception到的异常更加的精准捕捉的范围更细更小,也是程序中经常用的默认的都是这种捕捉方式。