Java EnumMap引发NullPointerException

Java EnumMap引发NullPointerException,java,nullpointerexception,enum-map,Java,Nullpointerexception,Enum Map,我有一个枚举和一个EnumMap 我将映射放入一个类中以隐藏“字节”值。所以我有一个set(Parameter,int)和set(Parameter,boolean)方法 public enum Parameter { BLAH } public class Parameters { private final Map<Parameter, Byte> parameters = new EnumMap<>(Parameter.class);

我有一个枚举和一个
EnumMap

我将映射放入一个类中以隐藏“字节”值。所以我有一个
set(Parameter,int)
set(Parameter,boolean)
方法

public enum Parameter {
    BLAH
}


public class Parameters {
    private final Map<Parameter, Byte> parameters = new EnumMap<>(Parameter.class);

    public byte set(Parameter parameter, boolean set) {
        return this.parameters.put(parameter, (byte) (set ? 0x01 : 0x00));
    }

    public byte set(Parameter parameter, int value) {
        return this.parameters.put(parameter, (byte) value);
    }
}

有人能向我解释一下is的行为吗?

问题在于您使用的返回值的方式,其记录如下:

与指定键关联的上一个值,如果键没有映射,则为null。(null返回值还可以指示映射以前与指定键关联的null。)

第一次为任何特定键调用
set
方法时,返回值将为
null
——但随后将其解装箱到
byte
,这将抛出您看到的异常


假设要返回上一个值,只需将每个方法的返回类型更改为
Byte

这将显示一个编译器错误:new EnumMap(Parameter.class)@史蒂芬贝克:为什么它会在那里抛出兼容错误?这是非常有效的代码。无法推断EnumMap的类型参数???@StefanBeike:Odd-它在Java 7中对我有效…@StefanBeike:它在Java 8中也对我有效。。。你确定你已经声明了一个名为
Parameter
的枚举吗?嗯,你说得对。在我把问题贴出来后,我自己就明白了。@MarcelJaeschke是的,每个人都这么对Jon说…;-)@邓肯大笑。每个人都是这么说的,当他们发布一个问题时,他们会让一群人免费做这个问题,而他们会花自己的宝贵时间想出一个解决方案。顺便说一句,人们点击Jon Skeet的“向上投票”按钮,就像摄影师看到名人时单击鼠标一样;)@说真的?所以我不可能忽略了拳击?!我在这里四年了,只问了一些问题。@MarcelJaeschke我说的是普通大众,而不是你。邓肯和我都只是玩玩而已。如果听起来粗鲁,我会道歉。我只是开个玩笑:)
final Parameters parameters = new Parameters();
//parameters.parameters.put(Parameter.BLAH, (byte) 0x00);
parameters.set(Parameter.BLAH, false); // NPE