天天看点

Java异常处理ExceptionError异常处理

来源:https://loliwithpick.github.io/deny.github.io/2019/03/22/exception/

Java 的所有异常继承于 java.lang.Throwable 类,而该类有两个重要的子类,分别是 Exception 类和 Error 类。它们是异常处理机制的重要组成部分。异常的划分体现了设计者对不同异常的分类。

Java异常处理ExceptionError异常处理

Exception

Exception 是程序正常运行时,可能并且应捕获进行相应处理的。一般情况下分为两种,分别是检查性异常和运行时异常。

检查性异常(Checked Exception)

检查性异常(Checked Exception)一般是由程序员或问题引起的,它必须在代码中显式地捕获并进行相应处理。比如,要打开一个不存在的文件会在编译期产生异常。

检查性异常的种类

检查性异常主要有两种:

  1. IOException(文件异常)
  2. SQLException(SQL 异常)

运行时异常(Runtime Exception)

运行时异常(Runtime Exception)是程序运行时由解释器产生的异常,由于运行时异常在随处都可出现,并且出现频率高,所以编译器不会对它进行检查。在代码中不必显式地补货,而是根据需要去捕获它。比如,数组下标访问越界。

运行时异常的种类

  1. NullPointerException(空指针异常)
  2. ArrithmeticException(算术异常)
  3. ClassCastException(类型转换异常)
  4. ArrayIndexOutOfBoundsException(数组下标越界异常)
  5. UnkownTypeExcepetion(未知类型异常)

Error

Error 是程序无法处理的错误,是不可查的,一般发生于 JVM 本身或 JVM 运行程序时。因为错误是超出程序控制和处理能力之外的,所以,一个合理的程序,即便发生了错误,我们也不应该尝试去处理错误(注解:这里可能会有误解,这里说的处理不是说我们不解决错误,而是不要捕获和处理错误。)。比如,JVM 运行出错。

错误的种类

  1. LinkageError(链接错误)
  2. VirtualMachineError(JVM 错误)
由于异常种类非常丰富,有些甚至会有更细的划分,所以在上面只列出了少数比较常见的异常。比如,链接错误有更多的子类(NoClassDefFoundError、UnsatisfiedLinkError 等等)。如果想要了解更多异常种类,请看其他一些更详细的文章或源码。

异常处理

异常处理原则

  1. 捕获特定异常,而不是通用异常

在捕获异常时,我们要保证我们的目的不被隐藏,并且保证程序不会捕获到我们不希望被捕获的异常。更不要尝试捕获 Throwable 和 Error,除非你真的需要,否则难以保证程序能正常处理 OutOfMemoryError。

  1. 不要生吞异常

生吞异常的意思是假设代码不会发生异常。由于种种原因,对于某些代码,我们不能完全保证其不会报错,所以,我们不能假设代码不会发生异常,否则的话,一旦发生错误,我们无从得知原因。

  1. 不使用 printStackTrace() 输出错误信息

printStackTrace() 方法会把出错信息输出到标准出错(STERR)。而标准出错不是合适的输出项,在生产环境中,极有可能无法收集错误信息。

异常处理方法

我们可以使用 try-catch-finally 或者 throw、throws 来进行捕获处理异常。而其中 try-catch-finally 有着以下几点注意事项:

  1. try 块负责抛出异常,后面可以接 0 个或者多个 catch 块。如果没有 catch 块,那么必须要有 finally 块。
  2. catch 块负责捕获与它关联的 try 块抛出的异常。
  3. finally 块保证在方法返回前,执行块内的代码,无论是否抛出或捕获异常。比如,关闭 jdbc 连接,关闭输入输出流等。
  4. 出现下面 4 种情况时,finally 块不会执行。
    1. finally 块发生异常。
    2. 在 finally 块之前通过 System.exit() 退出。
    3. finally 块所在的线程被关闭。
    4. cpu 关闭。
以上均为本人学习时的笔录总结,若有错误之处,请多多指教。

继续阅读