Frage

Ich bin mit Eclipse und es ist vollkommen zufrieden mit dem folgenden Code:

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
    }
}

die Plattform jedoch, dass ich es auf Abstürze an der Linie renne oben markiert. Durch Absturz, denken ein Äquivalent eines BSOD. Gibt es etwas falsch mit meinem Code, oder muss ich die Entwickler der Java-VM für meine Plattform verfolgen müssen?


EDIT:

Ok, vielen Dank für Ihre Antworten. Es stellte sich heraus, um einen Fehler in der Java-VM zu sein. Um es mit dem Entwickler, 'gloomyandy',

Dies ist ein bekanntes Problem mit Schnittstellen, die eine statische Initialisierer haben. Es ist in der aktuellen Entwicklung fixiert baut ...

War es hilfreich?

Lösung

Ich sehe kein Problem mit diesem Code, außer dass, wenn Sie Java5 oder höher verwenden, würden Sie besser dran, eine Enumeration mit:

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 :-)
    }
}

Update: , um den ENUM-Wert aus seiner Bytedarstellung neu erstellen, müssen Sie ergänzen MessageType mit dem folgenden (angepasst von Effective Java, 2nd Ed Artikel 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);
}

Andere Tipps

Es scheint vernünftig ...

Was ist, wenn Sie die „Geräte Message“ take off der Klasse, ist es immer noch abstürzen?

Der Code selbst ist vollkommen gesund. Ich kann es völlig in Ordnung, auf meiner Win7 Maschine kompilieren und ausführen (mit Java6); es klingt wie Sie einige ungewöhnliche System verwenden?

Wie jeder gesagt, sollte es funktionieren.
Sie können versuchen diese:

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

(MessageType ist nicht erforderlich, da die Klasse es implementiert).
Ich würde immer noch die Art und Weise bevorzugen Péter Török vorgeschlagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top