我正在使用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中的一个错误。引用开发者的话,'阴沉的',
这是具有静态初始化程序的接口的已知问题。它在当前的开发版本中得到修复......
答案 0 :(得分:3)
我没有看到此代码有任何问题,除非您使用Java5或更高版本,否则最好使用枚举:
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 :-)
}
}
更新:要从其字节表示重新创建枚举值,您需要使用以下内容补充MessageType
(改编自Effective 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);
}
答案 1 :(得分:1)
似乎合理......
如果您从班级中取出“实施MessageType”,它仍会崩溃吗?
答案 2 :(得分:1)
代码本身非常完美。我可以在我的Win7机器上完全编译并运行它(使用Java6);听起来你正在使用一些不寻常的系统?
答案 3 :(得分:0)
每个人都说,它应该有效 你可以尝试这个:
public class MessageTest implements MessageType
{
public static void main(String[] args)
{
int b = MESSAGES.length; // no MessageType here
}
}
(因为课程正在实施,所以不需要MessageType
)
我仍然希望the wayPéterTörök建议。