1.概念
指在程序执行的过程中,出现的非正常情况,最终导致JVM的非正常停止。(异常不等于语法错误)
2.异常体系
异常机制帮我们找到程序中的问题,异常的根类是java.lang.Throwable,其下有两个子类java.lang.Error(严重问题,我们无法解决,只能避免)和java.lang.Exception(平常所说异常,由于操作不当导致,可以避免)。
(1)Exception:编译期异常
//处理1
public static void main(String[] args)throws ParseException{ }//丢给虚拟机处理
//处理2
//使用try....catch...
//选中+Alt+回车 自动生成
//处理2
try{
//放可能出现异常的代码
}catch(){
//异常的处理逻辑
}
(2)RunimeException:运行期异常
无需处理,交给JVM处理
(3)Error:错误
3.异常处理
(1)throw关键词
可以在指定的方法中抛出指定异常
格式:throw new 异常类对象名(参数)
注意:①throw关键词必须写在方法的内部。②new的对象必须是Exceptin或其子类对象。③throw关键词后面创建的RunimeException或其子类,我们可交给JVM处理,若是编译异常,我们需要处理这个异常(使用try....catch...或throw)
判断是否为空:可以引用Objects.requireNonMull(obj)来判断
(1)throws关键词(第一种异常处理方式)
将异常交给别人处理(终止)
格式:throws new 异常类名(参数)
注意:①throws关键字必须写在方法声明处。②throws关键字后面必须是Exceptin或其子类对象。③方法内部如果抛出了多个异常对象,那么throws后边也要声明多个异常,若多个异常之间有子父类关系,那么直接声明父类异常即可。④调用了一个声明抛出异常的方法,我们必须处理声明的异常。要么继续throws,要么try....catch
(3)捕获异常try....catch(第二种异常处理方式)
java中对异常有针对性的语句进行捕获,可以对出现异常进行指定方式的处理(后续代码继续执行)
//格式
try{
//放可能出现异常的代码
}catch(异常类型 e){
//异常的处理逻辑
}
.....
catch(异常类型 e){
//异常的处理逻辑
}//catch可以有
4.获取异常信息
Throwable类中定义了一些查看方法
(1)public String getMessage( ):获取异常的描述信息,原因(提示给用户的时候,就会提示错误原因)<简短信息>
(2)public String toString( ):获取异常类型和异常描述信息<详细信息>
(3)public void printStackTrace( ):打印异常的跟踪栈信息并输出到控制台<默认方法,全面信息>
5.finally代码块
有一些特点代码无论异常是否产生,都需要执行。因为异常会引发程序跳转,导致有些语句执行不到。而finally可以解决,在finally代码块中存放的代码一定会被执行)
注意:①不能单独使用必须和try一起使用。②finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都要资源释放(IO)
//格式
try{
}catch(异常类型 e){
}
.....
catch(异常类型 e){
}finally{
//无论是否出现异常,都会执行
}
6.注意事项
(1)多个异常如何处理
①多个异常分别处理
②多个异常一次捕获,多次处理
catch里面定义的异常变量,如果有子父类关系,子类异常变量必须写在上边
③多个异常一次捕获,一次处理
(2)运行异常被抛出可以不处理,既不捕获也不声明抛出。
(3)如果finally有return语句,永远返回finally中的结果,要避免该情况。
(4)如果父类抛出多个异常,子类重写父类方法时抛出和父类相同的异常或父类异常的子类或不抛出异常
(5)父类方法没有抛出异常,子类重写父类方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
(6)try/catch后面可以追加finally代码块,其中代码一定会被执行,通常用于资源回收
7.自定义异常
在开发中根据自己的业务异常情况来定义异常类
如何定义:①自定义一个编译期异常:自定义类并继承于java.lang.Exception
②自定义一个运行时期异常:自定义类并继承于java.lang.RuntimeException
//格式
public class 类名 extends Exception / RuntimeException{
//添加一个空参构造方法
//添加一个带异常信息的构造方法(通过super调用父类处理方法)
}