Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从枚举构造函数引发异常?_Java_Enums_Constructor_Singleton - Fatal编程技术网

Java 如何从枚举构造函数引发异常?

Java 如何从枚举构造函数引发异常?,java,enums,constructor,singleton,Java,Enums,Constructor,Singleton,如何从枚举构造函数引发异常?例如: public enum RLoader { INSTANCE; private RLoader() throws IOException { .... } } 产生错误 未处理的异常类型IOException 因为实例是在静态初始值设定项中创建的,所以请改为抛出ExceptionInInitializeError。该场景无法工作 您正试图从构造函数中抛出选中的异常 此构造函数由实例枚举项声明调用,因此无法正确处理选中的异常 另外,在我看来,

如何从枚举构造函数引发异常?例如:

public enum RLoader {
  INSTANCE;
  private RLoader() throws IOException {
   ....
  }
}
产生错误

未处理的异常类型IOException


因为实例是在静态初始值设定项中创建的,所以请改为抛出ExceptionInInitializeError。

该场景无法工作

您正试图从构造函数中抛出选中的
异常

此构造函数由
实例
枚举项声明调用,因此无法正确处理选中的异常

另外,在我看来,从构造函数抛出异常是不好的风格,因为构造函数通常不应该做任何工作,尤其是不应该创建错误


此外,如果你想抛出一个<代码> IOExux<代码>,我假设你想从一个文件中初始化一些东西,所以你也许应该考虑这篇文章。

< p>我有一个例子,我想在一些设置类中使用枚举作为键。数据库将存储一个字符串值,允许我们更改枚举常量,而无需对数据库进行udpate(我知道有点难看)。我想在enum的构造函数中抛出一个运行时异常,作为监控字符串参数长度的一种方法,以避免命中数据库,然后在我自己可以轻松检测到约束冲突时得到约束冲突

public enum GlobalSettingKey {
    EXAMPLE("example");

    private String value;

    private GlobalSettingKey(String value) {
        if (value.length() > 200) {
            throw new IllegalArgumentException("you can't do that");
        }
        this.value = value;
    }

    @Override
    public String toString() {
        return value;
    }
}
当我为此创建一个快速测试时,我发现抛出的异常不是我的,而是ExceptionInInitializeError


也许这很愚蠢,但我认为在静态初始值设定项中抛出异常是一种相当有效的方案。

为什么要这样做?对我来说,这听起来像是对枚举概念的滥用。枚举值应该是常量,其创建不依赖于任何内容。即使从技术上讲,您可以这样做(通过抛出未检查的异常而不是已检查的异常),我建议您修改您的设计。如果您试图通过这个枚举实现一个单例,那么最好将其作为一个普通类手动实现。我正在实现一个单例,但是如何将其作为一个普通类手动实现会更好呢?我仍然必须从静态初始值设定项调用的代码中抛出异常。你可以从枚举构造函数中抛出未经检查的异常。仅仅通过访问枚举值就抛出异常有点令人讨厌。当它是一个单例getInstance()方法时还不错。@Péter Török作为一个普通类手工实现它会更好吗?我认为使用enum实现一个单例是可以的,正如前面所说的那样。@PéterTörök就我的理解而言,尤其是对于这个例子,为什么您会认为“如果您试图通过这个enum实现一个单例,最好将它作为一个普通类手工实现。”?虽然这是一个可能的解决方案,但我认为用这种方式解决问题是没有意义的。如果从构造函数抛出异常是一种不好的方式,那么当构造函数的一个参数无效并且会阻止类运行时,您该怎么办?我更喜欢通过抛出异常快速失败,这样我就可以获得有意义的堆栈跟踪。话虽如此,我同意你的看法,OP不应该试图在枚举的构造函数中抛出异常。@Kirk Woll:我更喜欢使用工厂方法来确保参数的有效性。另外,我主要关注的是检查异常,RuntimeException将是一种更好的方式来发出验证错误的信号?哦,可怜的可怜的新接线员。:)@柯克·沃尔:不是所有的实例化都是这样,但这一次需要对构造函数参数进行特殊验证。通常情况下,我使用的原则是除了赋值之外,不在构造函数内部工作,因此我的编程速度不如您:)从工厂方法引发异常与从构造函数引发异常之间真的有区别吗?你说tomato,我说TomatoE,但原始异常与ExceptionInInitializerError链接,因此如果对其调用'getCause()',将得到原始异常。