Java的异常处理的目的在于通过使用少于目前数目的代码来简化大型、可靠的程序的生成,并且通过这种方式可以使你更加自信:你的应用中没有未处理的错误。
使用异常所带来的一个明显好处是,它往往能够降低错误处理代码的复杂度。
**

异常分类

Throwable这个Java类被用来表示任何可以作为异常被抛出的类。Throwable对象可分为两种类型(指从Throwable继承而得到的类型):

  • Error:当Java虚拟机中发生动态链接故障或其他硬故障时,虚拟机会抛出 Error。简单的程序通常不捕获或抛出Error。专门用来处理严重影响程序运行的错误。系统错误(比如内存溢出),虚拟机错误,线程死锁。
  • Exception:包含了一般性的异常,这些异常通常在捕捉到i之后便可做妥善的处理,以确保程序继续运行。

Java 异常分为两种:

  • 运行时异常(不受检查异常):在编译时被强制检查的异常,即在方法的声明中声明的异常。即便不编写异常处理代码,仍能编译成功,且它必须在程序运行时才有可能发生。包括 RuntimeException 及其子类。比如 NullPointerException、IndexOutOfBoundsException
  • 非运行时异常(受检查异常):在方法声明中没有声明,但在方法的运行过程中发生的各种异常。这种异常会被自动捕获,一定要编写异常处理的程序代码才行,通常用来处理与输入/输出相关的操作。RuntimeException 以外的 Exception。IOException、SQLException 已经自定义的异常

image.png

异常使用指南

应该在下列情况下使用异常:

  • 在恰当的级别处理问题。(在知道该如何处理的情况下才捕获异常。)
  • 解决问题并且重新调用产生异常的方法。
  • 进行少许修补,然后绕过异常发生的地方继续执行。
  • 用别的数据进行计算,以代替方法预计会返回值。
  • 把当前运行环境下能做的事情尽量做完,然后把相同的异常重抛到更高层。
  • 把当前运行环境下能做的事情尽量做完,然后把不同的异常抛到更高层。
  • 终止程序。
  • 进行简化。(如果你的异常模式使问题变得太复杂,那用起来会非常痛苦也很烦人。)
  • 让类库和程序更安全。(这既是在为调试做短期投资,也是在为程序的健壮性做长期投资。)