Exception

  • Exception:程序本身可以处理的异常,可以通过catch进行捕获和处理。Exception可以分为Checked ExceptionUnchecked 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:受检查异常,不用catchthrows处理就无法通过编译,除了RuntimeException及其子类以外的其他Exception类及其子类都属于受检查异常。
  • Unchecked Exception:不受检查异常,不用处理也能通过编译,RuntimeException及其子类都统称为非受检查异常。
  • 默认使用Unchecked Exception,一般来说,只有当这个异常是业务逻辑的一部分,并且调用方必须处理它时才使用Checked Exception,如余额不足的业务。