ZetCode

Java RuntimeException 子类

最后修改于 2025 年 4 月 2 日

RuntimeException 是 Exception 的一个子类,它代表在 Java 虚拟机正常运行时可能发生的异常。与检查型异常不同,RuntimeException 不需要声明在方法签名中。

RuntimeException 通常指示编程错误,例如逻辑错误或 API 的不当使用。 它们是非检查型异常,这意味着编译器不会强制处理或声明它们。 常见的例子包括 NullPointerException 和 ArrayIndexOutOfBoundsException。

在本教程中,我们将通过实际示例探索各种 RuntimeException,了解它们的原因,并学习如何有效地处理它们。

NullPointerException

NullPointerException 发生在尝试访问或修改具有空值的对象引用时。 这是 Java 中最常见的 RuntimeException 之一。

Main.java
void main() {

    String text = null;
    try {
        System.out.println(text.length());
    } catch (NullPointerException e) {
        System.out.println("Caught NullPointerException: " + e.getMessage());
    }
}

在这个例子中,我们尝试调用一个空字符串引用上的 length() 方法。 这会抛出一个 NullPointerException,我们捕获并处理它。 在访问对象成员之前,务必检查是否为空以防止此异常。

ArrayIndexOutOfBoundsException

ArrayIndexOutOfBoundsException 是在尝试使用非法索引(负数或超出数组大小)访问数组元素时抛出的异常。

Main.java
void main() {

    int[] numbers = {1, 2, 3};

    try {
        System.out.println(numbers[3]);
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("Invalid array index: " + e.getMessage());
    }
}

在这里,我们尝试访问一个只有 3 个元素的数组(索引 0-2)的索引 3。 该异常被捕获并处理。 在访问之前,务必验证数组索引。

ClassCastException

ClassCastException 发生在尝试将一个对象强制转换为它不是实例的子类时。 这是使用继承时的一个常见问题。

Main.java
void main() {
    Object obj = "Hello";
    try {
        Integer num = (Integer) obj;
    } catch (ClassCastException e) {
        System.out.println("Failed to cast: " + e.getMessage());
    }
}

我们尝试将一个 String 强制转换为一个 Integer,这会抛出 ClassCastException。 在强制转换之前使用 instanceof 检查类型,以防止此运行时异常。

IllegalArgumentException

IllegalArgumentException 是指当方法接收到的参数对于其目的无效或不合适时抛出的异常。 它通常用于验证参数。

Main.java
void main() {

    try {
        setAge(-5);
    } catch (IllegalArgumentException e) {
        System.out.println("Invalid age: " + e.getMessage());
    }
}

void setAge(int age) {
    if (age < 0) {
        throw new IllegalArgumentException("Age cannot be negative");
    }
    // Set age logic
}

setAge 方法会针对负年龄抛出 IllegalArgumentException。 这是公共方法中进行参数验证的一个良好实践。

NumberFormatException

NumberFormatException 发生在尝试将字符串转换为数字类型,但字符串不具有适当的格式时。

Main.java
void main() {

    try {
        int num = Integer.parseInt("123abc");
    } catch (NumberFormatException e) {
        System.out.println("Invalid number format: " + e.getMessage());
    }
}

我们尝试将一个非数字字符串解析为整数,导致 NumberFormatException。 在进行数字转换尝试之前,务必验证字符串格式。

UnsupportedOperationException

UnsupportedOperationException 表示所请求的操作不受支持。 它通常用于不可变集合或未实现的方法中。

Main.java
void main() {
    List<String> immutableList = List.of("a", "b", "c");

    try {
        immutableList.add("d");
    } catch (UnsupportedOperationException e) {
        System.out.println("Operation not supported: " + e.getMessage());
    }
}

List.of 创建一个不可变的列表。 尝试添加元素会抛出 UnsupportedOperationException。 在修改之前检查集合的可变性。

ArithmeticException

ArithmeticException 是指当发生特殊的算术条件时抛出的异常,例如除以零或整数溢出。

Main.java
void main() {
    
    try {
        int result = 10 / 0;
    } catch (ArithmeticException e) {
        System.out.println("Arithmetic error: " + e.getMessage());
    }
}

除以零会抛出 ArithmeticException。 在进行除法运算之前,务必验证分母以防止此运行时错误。

来源

Java RuntimeException 文档

在本文中,我们探讨了 Java 中的各种 RuntimeException、它们的原因以及如何处理它们。 了解这些异常有助于编写更健壮的代码。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程