在Java中,异常类的结构层次图如下图所示:
在Java中,所有异常类的父类是Throwable类,Error类是error类型 异常的父类,Exception类是exception类型异常的父类,RuntimeException类是所有运行时异常的父 类,RuntimeException以外的并且继承Exception的类是非运行时异常
典型的RuntimeException包括NullPointerException、IndexOutOfBoundsException、IllegalArgumentException等。对于运行时异常,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。
典型的非RuntimeException包括IOException、SQLException等。java编译器强制程序员必须进行捕获处理,对于非运行时异常如果不进行捕获或者抛出声明处理,编译都不会通过
1、使用try和catch关键字进行异常捕获和处理。
- 三个块执行的顺序为try—>catch—>finally。
- 在有多个catch块的时候,是按照catch块的先后顺序进行匹配的,一旦异常类型被一个catch块匹配,则不会与后面的catch块进行匹配。
无论try块或者catch块中是否包含return语句,都会执行finally块。
注意千万不要在finally块中使用return,因为finally中的return会覆盖已有的返回值。
2、用throws关键字在方法后声明抛出异常
如果最终将异常抛给main方法,则相当于交给jvm自动处理,此时jvm会简单地打印异常信息
throws 和throw
throws出现在方法的声明中,表示该方法可能会抛出的异常,允许throws后面跟着多个异常类型
throw只会出现在方法体中,当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw出去
异常处理注意点:
- 只在必要使用异常的地方才使用异常,不要用异常去控制程序的流程
- 切忌使用空catch块
用Log日志将该异常进行记录,以便日后方便更新和维护 - 检查异常和非检查异常的选择
- 注意catch块的顺序, 不要把上层类的异常放在最前面的catch块(上层拦截掉,只匹配一个catch)。
- 不要将提供给用户看的信息放在异常信息里。
展示给用户错误提示信息最好不要跟程序混淆一起,比较好的方式是将所有错误提示信息放在一个配置文件中统一管理
- 避免多次在日志信息中记录同一个异常。
- 异常处理尽量放在高层进行。
尽量将异常统一抛给上层调用者,由上层调用者统一之时如何进行处理。如果在每个出现异常的地方都直接进行处理,会导致程序异常处理流程混乱,不利于后期维护和异常错误排查。由上层统一进行处理会使得整个程序的流程清晰易懂。
- 在finally中释放资源。
有使用文件读取、网络操作以及数据库操作等,记得在finally中释放资源。这样不仅会使得程序占用更少的资源,也会避免不必要的由于资源未释放而发生的异常情况。