返回Notes

/ notes

Java基础之异常处理

关于Java异常处理

Exception 和 Error

都继承了 Throwable 类。

Exception和Error的区别

  • error 为错误,exception 为异常 :Error 的出现,意味着程序出现了严重的问题,⽽这些问题不应该再交给 Java 的异常处理机制来 处理,程序应该直接崩溃掉,⽐如说OutOfMemoryError
  • Exception 的出现,意味着程序出现了⼀些在可控范围内的问题,我们应当采取措施进⾏挽救。

NoClassDefFoundError:程序在编译时可以找到所依赖的类,但是在运⾏时找不到指定的类⽂件,导致抛出该错误;原因可能是 jar 包缺失或者调⽤了初始化失败的类。

ClassNotFoundException:当动态加载 Class 对象的时候找不到对应的类时抛出该异常;原因可能是要加载的类不存在或者类名写错了。

在没有 try-with-resources 之前,finally 块常⽤来关闭⼀些连接资源,⽐如说 socket、数据 库链接、IO 输⼊输出流等

try-with-resources

Java 7 引入的一项重要语法糖

核心目的是自动释放外部资源,彻底告别繁琐且容易出错的 finally 手动关闭代码。资源类必须实现 java.lang.AutoCloseablejava.io.Closeable 接口

异常处理的实践

  • 尽量不要捕获 **RuntimeException**:尽量不要 catch RuntimeException,⽐如 NullPointerException、 IndexOutOfBoundsException 等等,应该⽤预检查的⽅式来规避。
  • 尽量使⽤ **try-with-resource** 来关闭资源
  • 不要捕获 Throwable
  • 不要省略异常信息的记录
  • 不要记录了异常⼜抛出了异常
  • 不要在 finally 块中使⽤ return
  • 抛出具体定义的检查性异常⽽不是 Exception
  • 捕获具体的⼦类⽽不是捕获 Exception 类
  • ⾃定义异常时不要丢失堆栈跟踪 MyServiceException("Some information: " , e)
  • finally 块中不要抛出任何异常
  • 不要在⽣产环境中使⽤ printStackTrace()
  • 对于不打算处理的异常,直接使⽤ try-finally,不⽤ catch
  • 记住早 **throw** **catch**原则:“早 throw, 晚 catch” 是 Java 中的⼀种异常处理原则。这个原则指的是在代码中尽可能早地抛出 异常,以便在异常发⽣时能够及时地处理异常。同时,在 catch 块中尽可能晚地捕获异常,以便 在捕获异常时能够获得更多的上下⽂信息,从⽽更好地处理异常。
  • 只抛出和**⽅法**相关的异常
  • 切勿在代码中使⽤异常来进⾏流程控制
  • 尽早验证⽤户输⼊以在请求处理的早期捕获异常
  • ⼀个异常只能包含在⼀个⽇志中
  • 将所有相关信息尽可能地传递给异常
  • 终⽌掉被中断线程
  • 对于重复的 try-catch,使⽤模板⽅法