异常
⭐概念:又称之为例外,指的是程序在执⾏过程中,出现的⾮正常的情况,最终会导致JVM的⾮正常停⽌。
(异常指的不是语法错误,语法错误编译无法通过,也不能产生字节码文件,不能运行)
⭐异常体系
Throwable体系(父类):
Error(子):不能处理的错误,只能事先避免。
例如:堆栈溢出
Exception(子):异常,可以纠正代码,使程序继续运行。
|-运行时异常/不检查异常
|-编译时异常/非运行时异常/已检查异常
⭐常用方法
1)String getMessage():获取发生异常的原因
2)String toString():后去异常的类型和异常描述信息
⭐常见运行时异常/不检查异常:
NullPointerException:空指针异常
ArrayIndexOutOfBoundException:数组下标越界异常
NoSuchElementException:没有这个元素异常
ClassCastException:类型转换异常
ConcurrentModificationException:并发修改异常
IllegalArgumentException:非法参数调用异常
IndexOutOfBoundsException:下标越界异常
(产生原因:a.一般由程序员逻辑错误引发的,应该从逻辑角度尽可能避免这类异常的发生。
b.遇到此类异常,程序中可以选择捕获处理,也可以不处理。
c.在正常编译阶段不会出现这种报错,运行阶段才会提示问题.)
⭐编译时异常/非运行时异常/已检查异常:
常见异常类型
IOException:IO异常
FileNotFoundException:文件未找到异常
ClassNotFoundException:类未找到异常
ParseExpection:格式化异常
UnsupportedEncodingException:不支持字符编码异常
产生原因:
a.在编译时期,就会检查没如果没有处理异常,则编译失败.
b.此类异常,程序中必须进行处理.
⭐异常处理
🐬异常处理的五个关键字:try、catch、finally、throw、throws
try-catch:捕获并处理异常
throw:抛出异常(创建异常)
throws:声明有可能出现的异常
finally:在任何情况下(特殊情况排除)都必须执行的代码
(可以try-catch-finally这样使用)
🐬抛出异常:thow
a.使用位置:方法(类)内声明一个具体的异常信息。
b.注意:
①.如果产生了问题,我们就会使用throw将异常抛出,也就是将问题返回给方法的调用者.
c.处理异常的方式:
①.捕获异常 - try/catch
②.声明异常 - throws
🐬声明异常: throws
a.使用位置: 通常在一个方法(类)上,声明能抛出的异常信息.
b.特点:出现异常,自己不作处理,让调用者来处理.
c.throws声明异常的思路
①.当前方法不知道如何处理这种类型的异常,该异常应该由上一级的调用者处理.
②.如果main方法也不知道如何处理这种异常,也可以使用throws声明抛出异常,最终该异常会交给JVM处理.
③.JVM对异常的处理方法是,打印异常的跟踪信息,并终止程序运行.
d. 方法重写 - 异常的声明限制(使用情况)
前提:必须在父子类关系中
子类重写父类的方法,方法名、参数返回值必须一致的情况下会造成方法的重写。
子类和父类方法可以不一致的地方:
访问权限:子类 大于等于 父类
异常声明:子类 小于等于 父类
🐬捕获异常:try - catch
a.使用位置:在方法中使用try-catch可以处理异常
b.特点:有针对行的进行捕获异常,可以对出现的异常进行指定方式处理
c.执行流程
①.程序从try里面的代码开始执行
②.出现异常,就会跳转到对应的catch中去执行
③.执行完毕后,程序还可以继续往下执行
d.注意
①.异常存在父子类关系,catch抓取异常时需要先抓取子类异常再抓取父类异常.
②.try只需要有一个,catch可以有多个
🐬finally
a.使用位置:存在方法中
b.一般用于程序一定要执行的地方
例如:关闭JDBC连接、关闭流
c.finally和return的执行顺序
①.当try代码块和catch代码块中有return,finally任然会被执行.
②.执行try或catch时代码块中有return,那么都一定会先执行finally语句.
③.finally语句一定执行在return语句之前.
⭐自定义异常类
1)自定义异常
a.可继承编译时异常类:Exception
b.可继承运行时异常类:RuntimeException
2)实现步骤
①.定义异常类
②.继承运行时异常 / 编译时异常
③.提供构造方法