【问题标题】:Null Pointer Exception in Java EnumJava枚举中的空指针异常
【发布时间】:2019-06-19 06:11:51
【问题描述】:

我正在学习 Java 中的 Enum 概念,但在练习时遇到了问题。

这里是代码sn-p,

public class MyClass {
    private String cardColor = CARDS.SPADE.cardColor; #Causes Null Pointer #Default Value
    private MyClass(CARDS card){
        this.cardColor = card.cardColor;
    }
    public static enum CARDS{
        SPADE("Black"),
        CLUB("Black"),
        DIAMOND("Red"),
        HEART("Red");
        private String cardColor = null;
        private MyClass obj = null;
        CARDS(String color){
            this.cardColor = color;
            obj = new MyClass(this);         #Trying to create object for MyClass 
        }
        public String getCardColor(){
            return this.cardColor;
        }
    }
    public static void main(String args[]) {
        System.out.println(CARDS.SPADE);
    }
}

我正在尝试在它的构造函数中创建一个私有的 MyClass 对象。这里的值 CARDS.SPADE 为空,我最终得到空指针异常。

如果我不在枚举构造函数中创建对象,一切都会完美,

obj = new MyClass(this);

我不明白为什么没有初始化静态枚举,我对这里的控制流感到困惑。有人可以解释一下这里出了什么问题吗?

【问题讨论】:

  • 为什么要在enum创建父类的实例?从您发布的内容来看,您似乎更希望将Cards 的实例作为MyClass 的类属性。你到底想做什么?
  • MyClass 有一个私有构造函数,在这里我试图为每个枚举卡设置一个 MyClass 实例。

标签: java enums enumeration


【解决方案1】:

你有一个循环依赖:CARDS枚举和MyClass实例的初始化相互依赖。
CARDS构造函数实例化MyClassMyClass构造函数本身依赖于@987654326 @ 尚未完全初始化的状态,如在挂起的枚举构造函数中。

要么打破这个循环,要么分两次做事。在没有双向关系的情况下初始化枚举,并在构造函数调用之后,通过 setter 将枚举值设置为 MyClass 实例。

请注意,NullPointerException 的“真正”原因是您没有引用枚举构造函数 (this) 中创建的当前实例,而是引用了枚举类本身的枚举值:@987654330 @.
第一个有状态,但第二个还没有,因为枚举构造函数还没有返回。

通过将枚举实例传递给MyClass 的构造函数,它将“工作”:

CARDS(String color){
        this.cardColor = color;
        obj = new MyClass(this);    
    }
}

// ...
public MyClass(CARDS cards){
     cardColor = cards.cardColor;
}

但总的来说,在构造函数主体期间将this 传递给另一个对象/类并不是一个好主意。如果对象状态在此时和构造函数调用结束之间发生变化,则此可能泄漏到不一致的状态。

【讨论】:

  • 有什么方法可以将 MyClass 的 cardColor 初始化为默认值,比如 spade 的颜色?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
相关资源
最近更新 更多