异常
什么是异常?
程序运行时期发生的问题就是异常
首先看一下我们之前学习遇到的一些也是比较常见的异常
-
数组角标越界
ArrayIndexOutofBoundsException -
空指针异常
NullPointerException -
栈溢出异常
StackOverFlowError -
堆溢出异常
OutofHeapError -
类型转换异常
ClassCastException -
数学异常
ArithmeticException -
数据转换异常
NUmberFormatException
我们发现有些是以Exception结尾的,有些是Error结尾的,Exception结尾的称为异常,Error结尾的称为错误,看一下区别:
- 异常:程序运行期间发生了异常,通常可以由针对性的处理方式的。
- 错误:程序运行期间发生了错误,通常不会有针对性的处理方式。错误的发生往往都是系统级别的问题,都是JVM所在系统发生的并反馈给JVM的,无法针对处理,只能修改代码。例如上面的 栈溢出异常StackOverFlowError 堆溢出异常 OutofHeapError无法针对处理。
我们如果用面向对象的思考方式对待异常异常应该有哪些内容?名称 位置 原因 ,这样异常就可以当成一个类去看待!程序有各种各样的错误,也就是异常的子类,这样异常继承体系就处来了 ,异常体系的顶层类是Throwable,当然它的最终父类也是Object。
异常的应用
在编写程序时,必须要考虑程序的问题情况。比如在写功能时,需要接受参数,在使用功能中使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,应该告诉调用者,传递合法的数据进来。这时需要使用异常这种方法来告诉调用者。所以定义程序需要考虑程序的健壮性。
一般来说当函数内部出现问题时,两种解决思路
- 要么函数内部自己解决
return 正常结果 - 要么函数将问题反馈给调用者
throw 异常对象
怎么使用异常呢?
-
创建一个异常对象。封装一些提示信息(自定义)。
-
需要将这个对象告知给调用者。怎么告知呢?怎么将这个对象传递到调用者处呢?通过关键字throw就可以完成。 throw异常对象;如:throw new ArrayIndexOutOfBoundsException(“错误的角标”);
-
throw用在函数内,抛出异常对象,并可以结束函数。
异常分类
Error
严重性错误 JVM直接抛出内存错误 ,直接改代码吧
Exception异常
在函数内抛出Exception,编译失败,因为编译器在检查语法时发生了错误。该程序已经出现问题,Java认为这个程序本身存在隐患,需要捕获或者声明出来(你要么把问题处理,要么把问题标识出来让调用知道)
RuntimeException异常
抛出RuntimeException,不需要捕获,不要声明呢?不是功能本身发生的异常,而是因为比如调用者传递参数错误而导致功能运行失败。这也是问题,需要通过异常来体现,但是这个异常不要声明出来的。声明的目的是为了让调用者进行处理。不声明的目的是不让调用者进行处理,就是为了让程序停止,让调用者看到现象,并进行代码的修正。
异常分两种
- 编译时异常:编译器会检测的异常。
- 运行时异常:编译器不会检测的异常。不需要声明。声明也可以,如果声明了,无外乎就是让调用者给出处理方式
对于编译时异常 通常有两种处理方案
- 声明:将问题标识出来,报告给调用者。如果函数内通过throw抛出了编译时异常,而没有捕获,那么必须通过throws进行声明,让调用者去处理。
- Java中对异常有针对性的语句进行捕获。
捕获格式:
try
{//需要被检测的语句。
}
catch(异常类 变量)//参数。
{//异常的处理语句。
}
finally
{//一定会被执行的语句。
}
throw和throws区别
- throw用在函数内。throws用在函数上。
- thorw抛出的是异常对象。throws用于进行异常类的声明,后面异常类可以有多个,用逗号隔开
finally使用
有一些特定的代码无论异常是否发生,都需要执行。因为异常会引发程序跳转,导致有些语句执行不到。无法满足这个需
求。异常捕获处理时java提供解决方案,finally就是解决这个问题的,这个代码块中存放的代码都是一定会被执行的。
异常细节
try catch finally 组合方式
try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。异常捕获处理。
void show()//不用throws
{try{throw new Exception();}catch(Exception e){
//处理方式}
}
try finally 组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理
的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。
void show()//需要throws
{try{throw new Exception();}finally{//关闭资源}
}
try catch finally组合:检测异常,并传递给catch处理,并定义资源释放。