侧边栏壁纸

Java 中的 java.lang.EnumConstantNotPresentException 异常解决办法

  • 奥沐嘉 2024年05月03日 21阅读 0评论
  • 在 Java 编程中,java.lang.EnumConstantNotPresentException 是一个运行时异常,通常发生在尝试访问枚举类型中不存在的常量时。这个异常是 java.lang.RuntimeException 的子类,表示程序在运行时遇到了预料之外的情况。下面我们将深入探讨这个异常的原因、场景以及如何避免。

    java.lang.EnumConstantNotPresentException 异常通常发生在以下几种情况:
    反序列化时枚举常量不匹配: 当使用 Java 序列化机制(如 ObjectOutputStream 和 ObjectInputStream)对枚举对象进行序列化和反序列化时,如果反序列化后的枚举常量在枚举类型定义中不存在,就会抛出此异常
    通过字符串访问枚举常量时出错: 使用 Enum.valueOf() 方法通过字符串访问枚举常量时,如果提供的字符串与任何枚举常量名都不匹配,也会抛出此异常。
    枚举常量被错误地修改或删除: 如果枚举类型的定义在代码中被修改,导致之前有效的枚举常量不再存在,那么加载旧版本代码的客户端尝试访问这些常量时,也会抛出此异常。

    下面是一个简单的示例,演示了可能导致 java.lang.EnumConstantNotPresentException 异常的场景:

    public enum Color {
        RED, GREEN, BLUE
    }
    
    public class TestEnum {
        public static void main(String[] args) {
            String colorName = args[0];
            try {
                Color color = Enum.valueOf(Color.class, colorName.toUpperCase());
                System.out.println("Selected color is: " + color);
            } catch (IllegalArgumentException e) {
                System.out.println("Invalid color: " + colorName);
            }
        }
    }

    在上面的代码中,我们定义了一个名为Color的枚举类型,其中包含了三个常量:RED,GREEN和BLUE。然后,在TestEnum类的main方法中,我们尝试通过Enum.valueOf方法从命令行参数中获取一个颜色名称,并将其转换为相应的Color枚举常量。如果输入的颜色名称不是Color枚举中的一个,那么Enum.valueOf方法将抛出IllegalArgumentException异常。

    但是,如果我们尝试访问一个不存在的枚举常量,例如:

    Color color = Enum.valueOf(Color.class, "YELLOW");

    这将不会抛出IllegalArgumentException异常,而是会抛出java.lang.EnumConstantNotPresentException异常,因为YELLOW并不是Color枚举中的一个常量。
    为了避免这种异常,我们应该在尝试访问枚举常量之前,先检查该常量是否存在。这可以通过调用枚举类型的values()方法来实现,该方法将返回一个包含所有枚举常量的数组。然后,我们可以遍历这个数组,检查是否存在我们要访问的常量。

    public class TestEnum {
        public static void main(String[] args) {
            String colorName = args[0];
            boolean isValidColor = false;
            for (Color color : Color.values()) {
                if (color.name().equalsIgnoreCase(colorName)) {
                    isValidColor = true;
                    System.out.println("Selected color is: " + color);
                    break;
                }
            }
            if (!isValidColor) {
                System.out.println("Invalid color: " + colorName);
            }
        }
    }

    在上面的代码中,我们首先假设输入的颜色名称是无效的,然后遍历Color枚举的所有常量,检查是否存在与输入名称匹配的常量。如果找到了匹配的常量,我们就将其打印出来,并将isValidColor标志设置为true。如果遍历完所有的常量后仍未找到匹配的常量,那么我们就打印出一条错误消息,说明输入的颜色名称是无效的。

    1

    —— 评论区 ——

    昵称
    邮箱
    网址
    取消
    博主栏壁纸
    43 文章数
    24 标签数
    9 评论量
    人生倒计时
    舔狗日记