代码之家  ›  专栏  ›  技术社区  ›  tekumara

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

  •  10
  • tekumara  · 技术社区  · 15 年前

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

    public enum RLoader {
      INSTANCE;
      private RLoader() throws IOException {
       ....
      }
    }
    

    产生错误

    3 回复  |  直到 15 年前
        1
  •  19
  •   tekumara    15 年前

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

        2
  •  3
  •   silent_h    14 年前

    我有一个例子,我想在一些设置类中使用枚举作为键。数据库将存储一个字符串值,允许我们更改枚举常量而不必修改数据库(我知道有点难看)。我想在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;
        }
    }
    

    当我为此创建一个快速测试时,我发现抛出的异常不是我的,而是一个ExceptionInInitializerError。

    也许这是愚蠢的,但我认为对于想要在静态初始值设定项中抛出异常来说,这是一个相当有效的场景。

        3
  •  1
  •   Johannes Wachter    15 年前

    这种情况是行不通的。

    你想扔一张支票 Exception

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

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

    如果你想扔 IOException 我假设您想从一个文件初始化一些东西,所以您也许应该考虑一下本文 dynamic enums .