异常产生原理:
1.JVM会根据异常产生的原因创建一个异常对象,这个异常对象包含了异常产生的(内容,原因,位置)
2.没有异常处理逻辑的情况下(try-catch),JVM就会把异常对象打印在控制台,会终止当前正在执行的java程序(中断处理)
throw:
- throw关键字必须写在方法的内部
- throw关键字后边new的对象必须是Exception或者是Exception的子类对象
- throw关键字抛出指定的异常对象,我们就必须处理这个异常对象
- 如果是RuntimeException或者是RuntimeException的子类对象,可以不处理,默认交给JVM处理
- throw关键字后边创建的是编译异常(写代码的时候报错),就必须处理这个异常,要么throws,要么try…catch
- 方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常
- 如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可
- 调用了一个声明抛出异常的方法,我们就必须的处理声明的异常
- 要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM
- 要么try…catch自己处理异常
try…catch:
- try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
- 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try…catch之后的代码
- 如果try中没有产生异常那么就不会执行catch中异常的处理逻辑
- Throwable类中定义了3个异常处理的方法
- String getMessage()返回此throwable的简短描述
- String toString()返回此theowable的详细消息字符串
- void printStackTrace()JVM打印异常对象默认此方法,异常信息是最全面的
- 多个异常使用捕获处理:
- 多个异常分别处理
- 多个异常一次捕获,多次处理
- 一个try多个catch注意事项;
- catch里边定义的异常变量如果有子父类关系,那么子类的异常变量必须写在上边,否则会报错
- 原因:try中如果出现了异常对象会把异常对象抛出给catch处理,抛出的异常对象会从上到下依次赋值给catch中定义的异常变量
- 一个try多个catch注意事项;
- 多个异常一次捕获一次处理
- 如果finally中有return语句,永远返回finally中的结果,应该要避免这种写法
子父类异常:
- 如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常
- 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时如果子类产生异常只能捕获处理,不能声明抛出
自定义异常类:
- 自定义异常类必须继承Exception或者RuntimeException
- 继承Exception:那么自定义异常类就是一个编译期异常,如果方法内部抛出了编译期异常,就抛出或者处理这个异常
- 继承RuntimeExcrption:那么自定义的异常类就是一个运行期异常,无需处理,交给虚拟机处理(中断处理)
- 格式:
- public class XXXException extends Exception | RuntimeException {
- 添加一个空参数的构造方法
- 添加一个带异常信息的构造方法
- }
- public class XXXException extends Exception | RuntimeException {