Question

J'utilise Eclipse, et il est parfaitement heureux avec le code suivant:

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

Cependant, la plate-forme que je suis en cours d'exécution sur les accidents à la ligne tracée ci-dessus. Par accident, pensez un équivalent d'un BSOD. Y at-il quelque chose de mal avec mon code, ou dois-je poursuivre les développeurs de la machine virtuelle Java pour ma plate-forme?


EDIT:

Ok, merci pour vos réponses. Il est avéré être un bug dans la machine virtuelle Java. Pour citer le développeur, 'gloomyandy',

  

Ceci est un problème connu avec les interfaces qui ont un initialiseur statique. Il est fixé dans le développement actuel construit ...

Était-ce utile?

La solution

Je ne vois pas de problème avec ce code, autre que si vous utilisez Java5 ou au-dessus, vous seriez mieux à l'aide d'un 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 :-)
    }
}

Mise à jour: pour recréer la valeur ENUM de sa représentation d'octets, vous devez MessageType supplément avec les éléments suivants (adapté de Effective Java, 2e Ed article 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);
}

Autres conseils

semble raisonnable ...

Que faire si vous prenez les « implémente MessageType » hors de votre classe, est-il encore plantage?

Le code lui-même est tout à fait son. Je peux compiler et exécuter parfaitement bien sur ma machine Win7 (avec java6); il semble que vous utilisez un système inhabituel?

Comme tout le monde dit, il devrait fonctionner.
Vous pouvez essayer celui-ci:

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

(MessageType n'est pas nécessaire, car la classe est mise en œuvre).
Je préfère encore la façon a suggéré Péter Török.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top