Java中的异常
主要可以分为两大类,即受检异常(checked exception)和 非受检异常(unchecked exception)
受检异常:
对于受检异常来说:如何我们在方法里声明了要有异常,那么在调用这个方法是必须对这个异常进行处理(捕获或者向上抛出),否则的话,编译就无法通过;
这种情况在IO操作中比较常见
非受检异常:
继承自RuntimeException,一般是运行时发生的异常,多是一些代码层面的错误。
非受检异常不用显式的去声明捕获,但是一旦出现异常,程序就会中断。
这种异常一般可以理解为是代码原因导致的。比如发生空指针、数组越界等。所以,只要代码写的没问题,这些异常都是可以避免的。也就不需要我们显示的进行处理。
Throwable
Throwable是java中最顶级的异常类,继承Object,实现了序列化接口,有两个重要的子类:Exception和 Error,二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Error
表示严重的问题,通常是系统级出现的错误,比如OOM内存溢出。
当出现Error时,Java虚拟机会抛出该错误并终止程序的执行,一般情况下无法通过代码来处理或恢复。
以下是几个常用的RuntimeException:
NullPointerException(空指针异常):当尝试访问一个空对象的成员或调用一个空对象的方法时抛出。
IllegalArgumentException(非法参数异常):当方法接收到一个不合法的参数时抛出,例如传入null或不符合预期的值。
IllegalStateException(非法状态异常):当对象的状态不符合方法调用的前提条件时抛出,例如在对象未初始化或已经关闭的情况下调用方法。
IndexOutOfBoundsException(索引越界异常):当访问数组、字符串或集合时使用了无效的索引时抛出,例如访问负数索引或超过容器大小的索引。
UnsupportedOperationException(不支持的操作异常):当调用一个不支持的操作时抛出,例如对只读集合进行修改操作。
ClassCastException(类转换异常):当尝试将一个对象转换为不兼容的类型时抛出,例如将一个不是子类的对象转换为子类类型。
ArithmeticException(算术异常):当出现数学运算错误时抛出,例如除以零或溢出。
这些RuntimeException是Java中常见的异常类型,它们都是继承自RuntimeException类,可以在代码中不进行显式的捕获和处理。
什么是自定义异常,如何使用自定义异常?
自定义异常就是开发人员自己定义的异常,一般通过继承Exception的子类的方式实现。
编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程。
这种用法在Web开发中也比较常见,一般可以用来自定义业务异常。如余额不足、重复提交等。这种自定义异常有业务含义,更容易让上层理解和处理。