RuntimeException及其子类的使用场景与示例

RuntimeException 是 Java 中的一个异常类,是所有未检查异常(unchecked exceptions)的超类。

未检查异常是在程序运行时可能发生的异常,不需要在方法或构造函数的 throws 子句中声明。

与之相对的是检查异常(checked exceptions),需要在方法或构造函数的 throws 子句中声明。

RuntimeException 使用场景

RuntimeException 及其子类的使用场景主要包括以下几种:

  1. 程序运行中可能会发生的错误:如对象强制转化不兼容等等。

  2. 非强制性检查的异常:不需要强制捕获的异常,程序员可以选择处理或者忽略。

  3. API 中的方法无法继续执行时:例如,某个方法的前置条件不满足时,可以抛出 IllegalArgumentException 等。

区分受检异常和非受检异常

  1. 预测性异常:某些异常可以在编码阶段预测到,并通过改进代码结构或逻辑来避免抛出。例如,NullPointerExceptionIllegalArgumentExceptionIllegalStateException等,在设计阶段可以通过参数检查或合理的程序状态管理来避免。
  2. 不可避免的运行时异常:有些异常是由于外部环境或非预期的运行时条件导致的,例如 ArrayIndexOutOfBoundsExceptionConcurrentModificationException 等,通常这些异常无法通过改变代码来完全避免(原则上依然是代码设计时就需要尽可能避免),但可以通过合理的异常处理机制来捕获和处理。
  3. 并发和线程异常:例如 IllegalMonitorStateException,应该通过正确的同步块和锁管理来避免手动抛出,以确保线程安全性和避免不必要的异常。
  4. 受检异常和非受检异常:受检异常(checked exceptions)通常需要显式地声明和处理,因此应该根据业务需求和异常情况来判断是否手动抛出。非受检异常(unchecked exceptions)通常是编程错误或者无法预料的情况,可以通过改进代码来避免抛出。

常见的受检异常

受检异常(checked exceptions)是在编译时必须处理或者声明的异常,它们通常表示程序可能可以处理的外部环境异常或错误。以下是一些常见的受检异常:

  1. IOException - 输入输出操作中可能出现的异常,如文件操作中的读写错误、网络操作中的连接问题等。
  2. SQLException - 数据库操作中可能出现的异常,如连接失败、SQL语法错误等。
  3. ClassNotFoundException - 当尝试加载类时找不到类文件时抛出。
  4. ParseException - 在解析字符串为日期、时间等格式时可能抛出的异常。
  5. InterruptedException - 当线程在等待、睡眠或被阻塞时被中断时抛出。
  6. NoSuchMethodException - 当请求的方法不存在时抛出,通常在通过反射调用方法时可能出现。
  7. InstantiationException - 当试图通过 Class.newInstance() 创建抽象类或接口的实例时抛出。
  8. IllegalAccessException - 当尝试访问类的私有方法或字段,或者没有权限访问类的时候抛出。
  9. CloneNotSupportedException - 当对象的 clone() 方法被调用,但对象的类没有实现 Cloneable 接口时抛出。
  10. ParseException - 尝试解析格式错误的字符串为日期或其他格式时抛出的异常。
  11. NoSuchFieldException - 在反射中,尝试访问不存在的字段时抛出的异常。
  12. NoSuchMethodException - 在反射中,尝试调用不存在的方法时抛出的异常。
  13. InstantiationException - 尝试实例化抽象类或接口时抛出的异常。
  14. MalformedURLException - 尝试解析 URL 时,URL 的格式不正确时抛出的异常。
  15. UnsupportedEncodingException - 当尝试使用不支持的字符编码名称创建字符串时抛出的异常。

常见的非受检异常

这些异常通常是由于编程错误、非法参数或者运行时环境导致的问题。

在编写代码时,应该通过适当的防御性编程和异常处理策略来预防和处理这些异常,而不是主动将其抛出。

  1. NullPointerException - 当应用程序试图在需要对象的地方使用 null 时抛出。
  2. IndexOutOfBoundsException - 用于指示索引超出范围的异常,包括 ArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsException 等。
  3. IllegalArgumentException - 表示向方法传递了一个不合法或不正确的参数。
  4. IllegalStateException - 当对象的状态不适合请求的操作时抛出,例如调用未初始化的对象或对象已经关闭的方法。
  5. ClassCastException - 当试图将对象强制转换为不是其子类的类时抛出。
  6. NumberFormatException - 当应用程序试图将字符串转换为数值类型,但字符串格式不正确时抛出。
  7. ConcurrentModificationException - 在单线程中,如果迭代器操作与修改操作冲突,则抛出此异常。
  8. UnsupportedOperationException - 当不支持请求的操作时抛出,例如尝试修改不可修改的集合。
  9. AssertionError - 当断言语句失败时抛出。
  10. Error 的子类,如 OutOfMemoryErrorStackOverflowError 等,通常表示严重的问题,应用程序一般无法处理,因此不要求捕获。