异常本身也是java中的一个类,产生异常就是创建异常对象并抛出了一个异常对象,java处理异常的方式就是中断。
异常的根类是java.lang.Throwable,下面有两个子类:java.lang.Error与java.lang.Exception;平时的异常是Exception,即编译期间异常;RuntimeException运行期异常
java处理异常:
throw关键字:throw关键字在指定的方法中抛出指定异常
格式: throw new XXXException(“异常产生的原因”);
1.throw必须写在方法内部
2.throw后new的子对象必须是Exception或Exception子类对象
3.throw关键字抛出指定的异常对象
若创建的是运行时异常则可以不处理默认交给JVM处理(打印异常对象,中断程序)
若创建的是编译异常,则必须处理,要么throws,要么try…catch
首先对方法传递过来的参数进行合法性校验,若不合法就使用抛出异常的方式告知调用者
Objects.requireNonNull(obj);判断传的对象是否为空
声明异常throws关键字:如果方法内通过throw抛出了编译时异常而没有捕获处理,则必须用throws进行声明,让调用者处理。在方法声明时使用
修饰符 返回值类型 方法名(参数列表) throws AAAException BBBException…
{throw new AAAException(“产生原因”);
throw new BBBException(“产生原因”);…}
try…catch捕获异常
格式:try{ 可能产生异常的代码 }
catch(定义一个异常的变量,用来接收try中抛出的异常对象){ 异常的处理逻辑,产生异常对象之后,怎么处理异常对象,一般在工作中,会把异常信息记录到一个日志中}
…catch(){}…
注意:
1.try中可能会抛出多个异常对象,可用多个catch处理异常对象。
2.try中产生了异常,则会执行catch中的异常处理逻辑,执行完后继续执行try
//try中抛出什么异常对象,catch中就定义什么异常变量,用来接收这个异常变量
3.出现异常直接结束程序,可在catch后加return
Throwable类中3个异常处理方法
String getMessage()返回throwable的简短描述 toString()返回详细字符串 void printStackTrace() JVM打印异常对象,默认此方法,异常信息最全面
finally代码块:一些特定代码无论异常是否发生,都需要执行。另外,异常会发生程序跳转,finally存放的代码一定会被执行。与try一同使用
try{ 可能产生异常的代码 }
catch(定义一个异常的变量,用来接收try中抛出的异常对象){ 异常的处理逻辑,产生异常对象之后,怎么处理异常对象,一般在工作中,会把异常信息记录到一个日志中}
…catch(){}…
finally{ 无论是否出现异常都会执行 }
注意:finally一般用于资源释放,无论程序是否异常,最后都要资源释放(IO)finally中应该避免return语句
1.多个异常分别处理
2.多个异常一次捕获,多次处理(catch里边定义的异常变量若有子父类关系,那么子类异常变量必须写在上面,否则报错)
3.多个异常一次捕获一次处理
2的原因:
运行时异常被抛出可以不处理,既不捕获也不声明,交给JVM处理
注意:父类异常是什么样,子类异常就是什么样。
如果父类抛出多个异常,子类重写父类方法时:
1.抛出和父类相同的异常
2.抛出父类异常的子类
3.不抛出异常
父类方法没有抛出异常,子类重写父类该方法时也不能抛出,此时子类产生该异常,只能捕获处理try catch,不能声明抛出
自定义异常
定义格式:public class XXXException extends Exception | RuntimeException{ 添加一个空参数构造方法
添加一个带异常信息的构造方法
}
注意:
1.自定义异常类一般以Exception结尾,说明类是异常类
2.自定义异常类必须继承Exception类(是编译期异常,必须处理,throws或者try…catch)或者RuntimeException(运行期异常,不需要处理,交给虚拟机,中断处理)