2015-02-25 3 views
2

У меня есть Enum и EnumMap<Parameters, Byte>.EnumMap raise NullPointerException

Я поместил карту в класс, чтобы скрыть значения «байт». Поэтому у меня есть метод 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); 
    } 
} 

Когда я называю любого из моих методов еще НПЖ поднимет какой пункт put! Если я сделал публикацию parameters и вызовет метод dircetly, он будет работать.

final Parameters parameters = new Parameters(); 
//parameters.parameters.put(Parameter.BLAH, (byte) 0x00); 
parameters.set(Parameter.BLAH, false); // NPE 

Может ли кто-нибудь объяснить мне, что такое поведение для меня?

+1

это должно показать ошибку компилятора: new EnumMap <> (Parameter.class); –

+0

@StefanBeike: Зачем это бросать ошибку compating? Это совершенно правильный код. –

+0

Невозможно вывести аргументы типа для EnumMap <> ??? –

ответ

8

Проблема заключается в том как вы используете возвращаемое значение put, которое документированное как:

the previous value associated with specified key, or null if there was no mapping for key. (A null return can also indicate that the map previously associated null with the specified key.)

Первый раз при вызове метода set для любого конкретного ключа, возвращаемое значение будет null - но вы затем распаковываете его на byte, который выдает исключение, которое вы видите.

Предполагая, что хочу вернуть, чтобы вернуть прежнее значение, просто измените тип возврата на Byte для каждого метода.

+0

гул, вы правы. Я понял себя сам после того, как я разместил вопрос. –

+1

@MarcelJaeschke Да, это то, что каждый говорит Джону ... ;-) –

+0

@ Duncan Lol. Это то, что каждый говорит, когда они публикуют вопрос, чтобы у них было куча людей, работающих на нем бесплатно, и они берут свое собственное сладкое время, чтобы найти решение. ;). Btw люди нажимают кнопку upvote для Jon Skeet точно так же, как фотоснимки нажимают, когда видят знаменитостей;) – CKing