Вопрос

Я использую Eclipse, и он идеально довольны следующим кодом:

public interface MessageType
{
    public static final byte   KICK     = 0x01;
    public static final byte   US_PING  = 0x02;
    public static final byte   GOAL_POS = 0x04;
    public static final byte   SHUTDOWN = 0x08;
    public static final byte[] MESSAGES = new byte[] {
        KICK,
        US_PING,
        GOAL_POS,
        SHUTDOWN
    };
}

public class MessageTest implements MessageType
{
    public static void main(String[] args)
    {
        int b = MessageType.MESSAGES.length;    //Not happy
    }
}

Тем не менее, платформа, которую я запускаю ее, вылетает в строке, отмеченной выше. По авариям, подумайте эквивалент BSOD. Есть ли что-то не так с моим кодом, или мне нужно преследовать разработчиков Java VM для моей платформы?


РЕДАКТИРОВАТЬ:

Хорошо, спасибо за ваши ответы. Оказалось ошибка в Java VM. Процитировать разработчик, «мракенды»,

Это известная проблема с интерфейсами, которые имеют статический инициализатор. Исправлено в текущем развитии сборки ...

Это было полезно?

Решение

Я не вижу никаких проблем с этим кодом, кроме того, если вы используете Java5 или выше, вам было бы лучше использовать Enum:

public enum MessageType
{
    KICK     (0x01),
    US_PING  (0x02),
    GOAL_POS (0x04),
    SHUTDOWN (0x08);

    private byte value;
    MessageType(byte value) { this.value = value; }
    byte getValue() { return value; }
}

public class MessageTest
{
    public static void main(String[] args)
    {
        int b = MessageType.values().length;    //Should be happy :-)
    }
}

Обновлять: Чтобы воссоздать значение enum из его байтового представления, вам нужно дополнить MessageType Со следующим (адаптированным от эффективной Java, 2-й ред. Пункт 31):

private static final Map<Byte, MessageType> byteToEnum = new HashMap<Byte, MessageType>();

static { // Initialize map from byte value to enum constant
  for (MessageType type : values())
    byteToEnum.put(type.getValue(), type);
}

// Returns MessageType for byte, or null if byte is invalid
public static MessageType fromByte(Byte byteValue) {
  return byteToEnum.get(byteValue);
}

Другие советы

Кажется разумным ...

Что делать, если вы возьмете «реализует MessageType» от вашего класса, он все еще сбой?

Сам код прекрасно звучит. Я могу компилировать и запустить его отлично в моей машине Win7 (с Java6); Похоже, вы используете некоторую необычную систему?

Как все сказали, он должен работать.
Вы можете попробовать это:

public class MessageTest implements MessageType
{
    public static void main(String[] args)
    {
        int b = MESSAGES.length;    // no MessageType here
    }
}

(MessageType не нужен, так как класс реализует его).
Я все еще предпочел бы путь Péter Török предложил.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top