异常
概述
异常指程序在执行过程中出现的状况
在Java等面对对象的编程语言中,将异常问题,用指定的类来表示,并提供一定的处理办法
Java中默认将异常交给jvm,jvm处理异常方式,即结束虚拟机,中断运行
异常体系结构
编译(checked)异常:编译时期,(编译时)被检查的异常,需明确处理方式,否则编译失败
运行(runtime)时异常:运行时期,(编译时)默认被声明的异常,运行时期出现问题,会报错
抛出异常
概述
throw:抛出(方法中使用) 手动抛出异常类的实例化对象,即产生异常
格式
throw new 异常类名(参数);
声明异常
概述
throws:处理异常的方式(方法声明上使用) 声明方法中存在的一个或多个异常类型,即把问题交给调用者处理
格式
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2....{//方法体}
应用
运行时异常默认被声明
编译时异常,未捕获,就必须通过throws声明,否者编译报错
当异常出现,将这个异常对象传递给调用者,并结束当前方法
捕获异常
概述
try...catch: 处理异常的方式(方法内使用) 捕获方法中存在的一个或多个问题标识,即编码者自己处理
异常被捕获,会避免将异常交给JVM处理,从而保障后续程序的执行
格式
try{
编写可能会出现异常的代码
}catch(异常类型 变量名){
处理异常代码/记录日志/打印异常信息/继续抛出异常
}
应用
运行时异常,被捕获,优先以捕获形式处理
编译时异常,被捕获,不再需要通过throws声明
当异常出现,异常被catch捕获,try中出问题位置之后的代码不再执行,程序继续执行catch后的内容
打印异常信息
public void printStackTrace();打印异常的跟踪栈信息并输出到控制台
finally关键字
概述
try...[catch...]finally:当try中内容执行,finally一定执行,若try执行前程结束(try没有执行),finally不执行
格式
try{
编写可能会出现异常的代码
}catch(异常类型 变量名){
处理异常代码/记录日志/打印异常信息/继续抛出异常
}finally{
try中代码执行后,一定要执行后,一定要执行的操作,常用于结束资源
}
使用形式
多个异常分别try,分别获取(处理)
多个异常一次try,分别获取(处理)
多个异常一次try,一次获取(处理)
try{
编写可能会出现异常的代码
}catch(异常类型 变量名){
处理异常代码/记录日志/打印异常信息/继续抛出异常
}
...
try{
编写可能会出现异常的代码
}catch(异常类型1|异常类型2... 变量名){
处理异常代码/记录日志/打印异常信息/继续抛出异常
}
注意事项
父类的方法声明异常,子类覆盖(重写)父类方法时,只能声明相同的异常或该异常子集
父类的方法未声明的异常,子类覆盖(重写)父类方法时,只能捕获,不能声明
try...catch捕获多个异常时,前边捕获的类不能是后边类的父类或同类
自定义异常
意义
异常具备发生后的JVM阻断功能及finally的强制执行,且具备复用性,if语句只能解决基本的逻辑判断,异常更号用一些
像类一样,java中不可能为所有情况提供异常,开发中的一些异常类型需要根据业务自行定义(例:年龄负数问题)
格式
自定义编译期异常:自定义类 并继承于java.lang.Exception
自定义运行时期异常:自定义类 并继承于java.lang.RuntimeException