java异常Exception

在Java中,异常类的结构层次图如下图所示:

java异常Exception_第1张图片

在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中释放资源。这样不仅会使得程序占用更少的资源,也会避免不必要的由于资源未释放而发生的异常情况。

你可能感兴趣的:(Java开发)