205. Java 异常 - Exception 类:表示程序运行中的可恢复问题

46 阅读3分钟

205. Java 异常 - Exception 类:表示程序运行中的可恢复问题

在 Java 中,大多数程序会抛出和捕获 Exception 类的对象。Exception 表示程序运行过程中发生的问题,但这些问题通常不会影响系统的正常运行。与 Error 不同,Exception 表示的是可以被处理的错误,程序通常能够恢复或继续执行。

1. Exception 类的继承关系

ExceptionThrowable 类的子类之一。Java 定义了许多 Exception 类的子类,表示不同类型的异常。与 Error 类相比,Exception 更常用于应用程序中,它表示程序可以捕获并进行处理的问题。

java.lang.Object
  └─ java.lang.Throwable
       └─ java.lang.Exception
            ├─ IOException
            ├─ SQLException
            ├─ IllegalArgumentException
            ├─ NullPointerException
            ├─ ……(其他异常)

2. Exception 类的常见子类

  • IOException:表示输入输出操作失败或中断,例如读取文件时发生错误。
  • SQLException:表示与数据库交互时发生的错误,如数据库连接失败。
  • IllegalArgumentException:表示方法接收到非法的参数值。
  • NullPointerException:表示试图访问或操作一个空对象的引用。

3. RuntimeException 类:程序错误的特殊标志

RuntimeExceptionException 的一个重要子类,专门用于表示程序中的编程错误或不当的 API 使用。运行时异常通常指示程序错误,如空指针引用、数组越界等。与其他 Exception 不同,RuntimeExceptionunchecked exception,意味着它不需要在方法签名中声明,也不需要在代码中捕获。

常见的 RuntimeException 子类
  • NullPointerException:试图通过 null 引用访问对象成员时抛出。
  • ArrayIndexOutOfBoundsException:当数组索引越界时抛出。
  • IllegalStateException:当方法被调用时,程序的状态不符合预期,通常是 API 使用错误。

4. 示例:NullPointerException

public class NullPointerDemo {
    public static void main(String[] args) {
        String str = null;
        // 尝试调用 null 引用的方法,抛出 NullPointerException
        System.out.println(str.length());
    }
}

在上面的代码中,str 被赋值为 null,然后尝试调用 str.length(),这会抛出 NullPointerException,因为 strnull,无法访问其成员。

5. 示例:IllegalArgumentException

public class IllegalArgumentDemo {
    public static void main(String[] args) {
        // 使用非法参数调用方法,抛出 IllegalArgumentException
        setAge(-1);
    }

    public static void setAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative.");
        }
        System.out.println("Age is: " + age);
    }
}

在这个示例中,setAge 方法被调用时,传入了一个非法的负数参数。由于年龄不能为负数,方法抛出了一个 IllegalArgumentException,提示用户传入的参数不合法。

6. 为什么不推荐抛出 RuntimeException

尽管 Java 提供了运行时异常 RuntimeException,但在实际开发中,过度使用或随意抛出运行时异常是不推荐的做法。许多开发者认为,运行时异常指示着程序员的错误,而不是程序本身应该处理的异常。

例如,使用 RuntimeException 作为参数验证的机制或在预期错误情况下抛出运行时异常,都可能会导致程序的可维护性降低。因此,建议仅在必要时使用运行时异常,尤其是在表示程序逻辑错误或不当API 使用的情况下。

7. 总结

  • Exception:表示程序执行过程中可恢复的错误,通常可以通过异常处理来恢复程序的正常执行。
  • RuntimeException:专门表示 API 使用不当或程序逻辑错误,属于未经检查的异常(unchecked exception),无需在方法签名中声明。
  • 常见子类IOExceptionSQLExceptionNullPointerException 等,帮助开发者更细致地捕获并处理不同类型的异常。

通过理解 Exception 类及其子类的使用,我们可以更加灵活地处理程序中的错误,确保程序的健壮性和可维护性。