异常
概述:程序在执行中遇到非正常情况(非语法错误)导致JVM停止运行。异常本身是一个类,产生异常就是创建异常对象并抛出,Java中处理异常的方式是中断。
异常体系
异常机制本质是帮助我们找出程序中的问题,根类是java.lang.Throwable
,其下两个子类是Error
和Exception
,前者必须修改代码程序才能继续执行,后者是由于使用不当导致,可以避免。Exception
一般指编译期异常,指代码编译时出现的问题,而它的特殊子类RuntimeException
指运行期异常。
异常处理
常用关键字:try,catch,finally,throw,throws
-
抛出异常:
throw
- 作用:用在方法内,抛出一个指定的异常对象。将此对象传递到调用者处并结束当前方法的执行。在调用方法时,先对接收到的参数数据进行合法性校验,若其不合法,则以抛出异常的方式告诉调用者传递合法参数。
- 格式:
throw new XxxException(参数);//可为自己编写的提示信息
- 注意:若创建的是
RuntimeException
或其子类对象,可默认交给JVM处理(红字体打印并中断);若throw
关键字后创建的是编译异常对象(写代码时报错),我们就要通过throws
声明抛出交给调用者处理或try...catch
自己处理此异常。
-
声明异常:
throws
-
作用:将问题标识出来,报告给调用者。若方法内通过
throw
抛出了异常而没有进行捕获处理,则必须通过throws
声明,交给调用者处理。 -
格式:
修饰符 返回值类型 方法名(参数)throws 异常类名1,异常类名2...{}
-
注意:若方法内部抛出的多个异常对象间有继承关系,直接声明父类异常即可。
当调定义了一个抛出编译异常的方法,则必须在该方法修饰符处使用
throws
关键字声明异常(Alt+Enter
),在调用该方法的方法前也要作声明处理。
-
-
捕获异常:
try...catch
-
作用:通过声明抛出处理,程序碰到异常会立刻终止。因此需自己处理异常,定义碰到异常后的处理逻辑使得程序继续运行。
-
格式:
try{ //可能产生异常的代码,调用带异常的方法等 }catch(异常类型 变量名){ //用于接收异常对象 //异常的处理逻辑,一般会把异常信息记录到日志中,可有多个catch }
-
注意:捕获异常无需在调用时声明抛出,即未将方法中的异常声明给异常调用者,而是直接执行调用时的
catch
语句,因此只需在定义该方法时声明抛出异常即可。若想在catch后直接结束方法,return即可。
-
-
Throwable
类中3个异常处理方法-
String getMessage()
返回此异常对象的简短消息字符串。(异常产生原因) -
String toString()
重写了Object类的toString方法,返回略详细描述。(异常类型及原因) -
void printStackTrace()
JVM默认此方法打印异常对象,信息最详细包括异常产生位置、原因及内容。
-
-
finally
代码块:跟在try...catch
语句之后,无论是否出现异常都会执行(try中代码发生异常后会直接跳到catch,后面的语句执行不到)。一般用于资源释放(回收)。- 格式:
finally {}
- 格式:
常见异常分类
-
运行期异常:
-
空指针异常
NullPointerException
Objects非空判断:通过Objects类中的静态方法
requireNonNull
查看传入的参数对象是否为空,是则抛出空指针异常,否则返回该对象。 -
数组索引越界异常
ArrayIndexOutOfBoundsException
-
-
编译期异常:
- 文件后缀名异常
IOException
,.endwith
获取文件后缀名。 - 文件查询异常
FileNotFoundException
,是上面异常的子类。
- 文件后缀名异常
异常捕获处理注意事项
-
多个异常分别处理
顾名思义,对每个可能出现的异常都分别进行捕获和处理。
-
一次捕获,多次(一次)处理,常用
将可能出现的异常放在一个try中,在分别catch处理。需注意若catch里的异常变量有父子关系,则子类必须写在上面,不然报错。一次处理即只使用一个所有异常都可继承的父类异常捕获。
-
finally
中应避免使用return
语句,否则会永远返回finally
中的结果。 -
父子类异常:
- 子类重写父类方法时,可抛出和父类相同的异常,或父类异常的子类,或者不抛出。
- 父类方法没有抛出,子类重写时也不能抛出。若子类产生该异常,则只能捕获处理。
自定义异常类
格式:
public class XxxException extends Exception / RuntimeException{
public XxxException(){
super();
} //空参构造方法
public XxxException(String message){
super(message);
} //带信息的构造方法,调用父类异常信息的构造方法
}