Exception
Exception
- Exception:程序本身可以处理的异常,可以通过
catch进行捕获和处理。Exception可以分为Checked Exception和Unchecked Exception两类。- Checked Exception:受检查异常,必须处理
- Unchecked Exception:不受检查异常,不必须处理
1. Checked Exception
-
Checked Exception:受检查异常,必须处理。在代码编译过程中,如果异常没有被
catch或者throws关键字处理,就没法通过编译。 -
除了
RuntimeException及其子类以外,其他的Exception类及其子类都属于受检查异常 。常见的受检查异常有:IO 相关的异常、ClassNotFoundException、SQLException…。
2. Unchecked Exception
- Unchecked Exception:不受检查异常,不必须处理。在代码编译过程中,即使不处理不受检查异常也可以正常通过编译。
RuntimeException及其子类都统称为非受检查异常,常见的有:NullPointerException(空指针错误)IllegalArgumentException(参数错误比如方法入参类型错误)NumberFormatException(字符串转换为数字格式错误,IllegalArgumentException的子类)ArrayIndexOutOfBoundsException(数组越界错误)ClassCastException(类型转换错误)ArithmeticException(算术错误)SecurityException(安全错误比如权限不够)UnsupportedOperationException(不支持的操作错误比如重复创建同一用户)- ……
3. 使用 Checked Exception 还是 Unchecked Exception?
- 默认使用
Unchecked Exception,只在必要时才用Checked Exception。 - 一般来说,只在一种情况下使用
Checked Exception:当这个异常是业务逻辑的一部分,并且调用方必须处理它时。比如说,一个余额不足异常。这不是 bug,而是一个正常的业务分支,我需要用Checked Exception来强制调用者去处理这种情况,比如提示用户去充值。这样就能在保证关键业务逻辑完整性的同时,让代码尽可能保持简洁。
4. 总结
Checked Exception:受检查异常,不用catch或throws处理就无法通过编译,除了RuntimeException及其子类以外的其他Exception类及其子类都属于受检查异常。Unchecked Exception:不受检查异常,不用处理也能通过编译,RuntimeException及其子类都统称为非受检查异常。- 默认使用
Unchecked Exception,一般来说,只有当这个异常是业务逻辑的一部分,并且调用方必须处理它时才使用Checked Exception,如余额不足的业务。
