Kotlin enum类与companion设计的不协调--NPE导致ClassNotFoundException, Could not initialize class.

在Kotlin 1.1.0环境中,将原本的Java enum类转换为Kotlin时,由于Kotlin使用companion object代替静态成员,可能导致运行时错误。当enum实例尝试访问companion object的字段时,由于companion对象尚未初始化,产生NPE,进而引发ClassNotFoundException。解决方案包括将companion object移到单独的类或回归Java实现。
摘要由CSDN通过智能技术生成

环境: JDK8+kotlin 1.1.0
构建工具:Maven 3

项目中有一个定义报警类型的enum类最开始使用java编写, 后来改成了kotlin. IDE和编译都没有提示错误, 运行时却发现错误.ClassNotFoundException, Could not initialize class.

原来是kotlin使用companion代替static, 而enum类是在类初始化时就初始化实例, 如果在enum实例中引入到了companion object中的字段, ide和编译器都不会提示错误, 但是运行那么就会导致enum类初始化失败. 因为初始化实例时, companion object还没有初始化. 引用其字段, 导致NPE, 类初始化失败, 导致ClassNotFoundException, Could not initialize class.

Java代码

public enum AlarmType {
    MEMORY("memory", AlarmType.CONTAINER_TYPE, true),
    CPU("cpu", AlarmType.CONTAINER_TYPE, true);

    public static final int DEFAULT_TYPE = 0;
    public static final int CONTAINER_TYPE = 1;
    public static final int DOCKER_DAEMON_TYPE = 2;
    public static final i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值