Error 和 Exception

Exception 和 Error, ⼆者都是 Java 异常处理的重要⼦类, 各自都包含⼤量子类。均继承自 Throwable 类。

Error 表示系统级的错误, 是 java 运行环境内部错误或者硬件问题, 不能指望程序来处理这样的问题, 除了退出运行外别无选择, 它是 Java 虚拟机抛出的。

Exception 表示程序需要捕捉、 需要处理的常, 是由与程序设计的不完善而出现的问题, 程序必须处理的问题。

异常类型

Java中的异常, 主要可以分为两大类, 即受检异常( checked exception) 和非受检异常( unchecked exception)

受检异常

对于受检异常来说, 如果⼀个方法在声明的过程中证明了其要有受检异常抛出:

  1. public void test() throw new Exception{ }

那么,当我们在程序中调用它的时候, ⼀定要对该异常进行处理( 捕获或者向上抛出) , 否则是无法编译通过的。 这是⼀种强制规范。

这种异常在 IO 操作中比较多。 比如 FileNotFoundException , 当我们使用 IO 流处理⼀个文件的时候, 有⼀种特殊情况, 就是文件不存在, 所以, 在文件处理时他会显示抛出 FileNotFoundException, 目的就是告诉这个方法的调用者,我这个方法不保证⼀定可以成功, 是有可能找不到对应的文件的, 你要明确的对这种情况做特殊处理哦。

所以说, 当我们希望我们的⽅法调⽤者, 明确的处理⼀些特殊情况的时候, 就应该使⽤受检异常。

非受检异常

对于非受检异常来说, ⼀般是运行时异常, 继承自 RuntimeException。 在编写代码的时候, 不需要显示的捕获,但是如果不捕获, 在运行期如果发⽣异常就会中断程序的执行。

这种异常⼀般可以理解为是代码原因导致的。 比如发生空指针、 数组越界等。 所以, 只要代码写的没问题, 这些异常都是可以避免的。 也就不需要我们显示的进行处理。

试想⼀下, 如果你要对所有可能发生空指针的地方做异常处理的话, 那相当于你的所有代码都需要做这件事。

异常相关关键字

throws、 throw、 try、 catch、 finally

try ⽤来指定⼀块预防所有异常的程序;

catch 子句紧跟在try块后⾯, 用来指定你想要捕获的异常的类型;

finally 为确保⼀段代码不管发生什么异常状况都要被执行;

throw 语句⽤来明确地抛出⼀个异常;

throws ⽤来声明⼀个方法可能抛出的各种异常;

正确处理异常

异常的处理方式有两种:1、 自己处理。 2、 向上抛, 交给调用者处理。

异常,千万不能捕获了之后什么也不做,或者只是使用e.printStacktrace。

具体的处理方式的选择其实原则比较简明: 自己明确的知道如何处理的, 就要处理掉。 不知道如何处理的, 就交给调用者处理。

自定义异常

自定义异常就是开发⼈员自己定义的异常, ⼀般通过继承 Exception 的子类的方式实现。

编写自定义异常类实际上是继承⼀个API标准异常类, 用新定义的异常处理信息覆盖原有信息的过程。

这种用法在Web开发中也比较常见, ⼀般可以用来自定义业务异常。 如余额不足、 重复提交等。 这种自定义异常有业务含义, 更容易让上层理解和处理