gpt4 book ai didi

java - 什么时候抛出 java.lang.EnumConstantNotPresentException?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:48 25 4
gpt4 key购买 nike

根据 java API,当应用程序尝试按名称访问枚举常量并且枚举类型不包含具有指定名称的常量时,将抛出 EnumConstantNotPresentException。

因此我决定想出一个会抛出 java.lang.EnumConstantNotPresentException 的场景,所以我写了以下三个类。

MyEnum 类:

package my.enumtest;

enum MyEnum {
A, B, C;
}

MyEnumTest1 类:

package my.enumtest;

import my.enumtest.MyEnum;

class MyEnumTest1 {

public static void main(String [] args) {
System.out.println(MyEnum.A);
}
}

MyEnumTest2 类:

package my.enumtest;

import my.enumtest.MyEnum;

class MyEnumTest2 {

public static void main(String [] args) {
System.out.println(MyEnum.valueOf("A"));
}
}

我编译了所有三个,然后更改了 MyEnum 类以删除常量“A”并重新编译它:

package my.enumtest;

enum MyEnum {
B, C;
}

在使用新的 MyEnum 类执行 MyEnumTest1 时,出现以下异常:

Exception in thread "main" java.lang.NoSuchFieldError: A at my.enumtest.MyEnumTest1.main(MyEnumTest1.java:8)

在使用新的 MyEnum 类执行 MyEnumTest2 时,出现以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: No enum constant my.enumtest.MyEnum.A at java.lang.Enum.valueOf(Unknown Source) at my.enumtest.MyEnum.valueOf(MyEnum.java:3) at my.enumtest.MyEnumTest2.main(MyEnumTest2.java:8)

如您所见,我在所有情况下都没有遇到 EnumConstantNotPresentException,所以有人可以向我提供 EnumConstantNotPresentException 类的用法吗?

P.S. 我知道 API 可以抛出这个异常过去常常反射(reflection)性地阅读注释,但我正在寻找更明显(更简单)的场景。

最佳答案

如果您想知道特定异常何时抛出,您应该做的第一件事是阅读 the documentation正如 JB Nizet 提到的那样。它说:

Thrown when an application tries to access an enum constant by name and the enum type contains no constant with the specified name. This exception can be thrown by the API used to read annotations reflectively.

链接指向 AnnotationElement,文档说:

Similarly, attempting to read an enum-valued member will result in a EnumConstantNotPresentException if the enum constant in the annotation is no longer present in the enum type.

这足以制作一个示例。创建以下类:

// TestEnum.java
public enum TestEnum {
A, B, C;
}

// TestAnnotation.java
import java.lang.annotation.*;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
TestEnum value();
}

// TestClass.java
@TestAnnotation(TestEnum.C)
public class TestClass {

}

// ReadAnnotation.java
public class ReadAnnotation {
public static void main(String[] args) {
System.out.println(TestClass.class.getAnnotation(TestAnnotation.class).value());
}
}

编译一切并运行ReadAnnotation。你会得到 C

现在从 TestEnum 中删除 C 并仅重新编译 TestEnum 类,保留其他类。如果您现在启动 ReadAnnotation,您将获得:

Exception in thread "main" java.lang.EnumConstantNotPresentException: TestEnum.C
at sun.reflect.annotation.EnumConstantNotPresentExceptionProxy.generateException(Unknown Source)
at sun.reflect.annotation.AnnotationInvocationHandler.invoke(Unknown Source)
at com.sun.proxy.$Proxy1.value(Unknown Source)
at ReadAnnotation.main(ReadAnnotation.java:4)

如果您想知道它是否会被其他任何东西抛出,您可以扫描 JDK 源代码以查找此异常名称。我没有发现任何其他关于此异常的提及,因此似乎反射是唯一可能的情况。

关于java - 什么时候抛出 java.lang.EnumConstantNotPresentException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31261960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com