1:Java异常结构图
2:异常父类Throwable以及子类
- 有两个重要的子类:
Exception
和Error
,二者都是Java异常处理的重要子类,他们都包含大量的子异常类。
Exception
- 程序本身可以处理的异常,并可以通过try/catch块捕获处理的异常
eg:RuntimeException、NullPointerException、ArrayIndexOutOfBoundException等等
Error
- 程序无法处理的错误,表示程序运行中出现的比较严重的问题,大部分与代码编执行没有关系,也不能被捕获处理
eg:OutOfMemoryError、NoClassDefFoundError等等
3:按照编译器是否强制要求处置异常分类
可查的异常(checked exceptions)
- 除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
不可查的异常(unchecked exceptions)
- RuntimeException及其子类和Error,编译过程中不去处理,仍然可以正常编译通过。
4:Exception具体分类
运行时异常类似可查异常
- RuntimeException类及其子类的异常
如NullPointerException、IndexOutOfBoundsExceptiond等
,这种异常一般属于不可检查异常,不影响编译,代码处理过程中可以选择性的处理,但还是建议尽量避免类似的异常发生,中断程序。
非运行异常类似不可查异常
- 也叫做编译异常RuntimeException之外的异常
如IOException、SQLException以及用户自定义的异常
若不处理,程序无法编译通过。
5:异常处理
正常处理方式(具体使用不过多赘述)
- try{}catch{}
- try{}catch{}finally{}无论有无异常finally代码块都会被执行
- try{}finally{}也是可以组合使用的但是catch{}finally{}不可以
注意:
在继承关系中,子类覆盖父类的方法,抛出异常的范围不能比父类更宽泛异常的使用.
异常链
可以使用继承throwable的initCause来进行异常类型转化,已一个优美可控的输出来处理异常
MyException
提示性异常可以直接抛到前端用户查看
Exception
除MyException之外的异常不可以直接抛到前端不友好,通过initCause()方法将此类异常吃掉转化成MyException自定义用户可接受的信息,将实际异常放到了异常的CauseBy部分便于排查问题ßß举个栗子
public class TestException {
try {
String response="JsonStr"
JSONObject jsonResponse = JSONObject.parseObject(response);
if (!jsonResponse.getBoolean("success")) {
throw new MyException("友好提示信息");
}
} catch (MyException me) {
throw me;
} catch (Exception e) {
Exception me = new MyException("转化成的友好提示信息");
me.initCause(e);
throw me;
}
}