详解Java中的异常
JAVA中有两种错误第一种是编译中出现的语法错误,第二就是运行中会出现的错误(也称为异常)
第一种是编写代码时候的语法错误,会导致编译不能通过,这个是由编译器检查的
第二种就是异常,计算机不能提前检测到,异常又分为可查异常和不可查异常
(一)Java的异常层次结构
要想明白Java中可查异常和不可查异常的区别,我们首先来看一下Java的异常层次结构。
这是一个简化的Java异常层次结构示意图,需要注意的是所有的类都是从Throwable继承而来,下一层则分为两个结构,Error和Exception。其中Error类层次描述了Java运行时系统的内部错误和资源耗尽错误,这种错误除了简单的报告给用户,并尽力阻止程序安全终止之外,一般也米有别的解决办法了
(二)可检查异常和不可检查异常的区别
有了上面的认识之后,我们再来看什么是checked异常,什么是unchecked的异常。其实,Java语言规范对这两个定义十分简单,将派生于Error或者RuntimeException的异常称为unchecked异常,所有其他的异常成为checked异常
可检查异常 : 编译时被检测的异常 (throw后,方法有能力处理就try-catch处理,没能力处理就必须throws)。编译不通过,检查语法(其实就是throw和throws的配套使用)。
不可检查异常 : 编译时不被检查的异常(运行时异常。RuntimeException及其子类)。编译通过。
(三)、不可检查异常的特点
一般来说,我们在方法体内出现异常,我们用throw 关键字 将 异常对象或 异常对象的引用抛出,如果当前方法无法处理异常,那么必须在方法的参数列表后方法体前 必须 用 throws 声明异常所属类,交给调用者去处理。但是RuntimeException是非常特殊的子类,你可以不用throw和throws,哪怕你throw了,也没必要thtows,即使你throws了,调用者也没必要try-catch
1> 如果在函数内容中抛出该类异常或其子类异常,函数上可以不用声明,编译一样通过
2> 如果在函数上声明该异常,调用者可以不同处理(try-catch),编译一样通过
为什么不用声明 ?
之所以不用在函数上声明,是因为不需要让调用者处理,当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望程序停止后由程序员对代码进行修正。