我有这样的代码:switch语句中的这个值如何被初始化?
int putReferenceItem(Reference reference) {
switch (reference.type) {
case CLASS:
return putStringItem(CONSTANT_Class, reference.name);
case FIELD:
case METHOD:
case INTERFACE_METHOD:
int itemTag;
switch (reference.type) {
case FIELD:
itemTag = CONSTANT_Fieldref;
break;
case METHOD:
itemTag = CONSTANT_Methodref;
break;
case INTERFACE_METHOD:
itemTag = CONSTANT_InterfaceMethodref;
break;
}
return putStringItem(itemTag, reference.owner, reference.name, reference.descriptor);
case HANDLE:
return put(CONSTANT_MethodHandle, reference.kind, 0, 0, reference.owner, reference.name, reference.descriptor);
case TYPE:
return putStringItem(CONSTANT_MethodType, reference.descriptor);
default:
throw new Error("Unreachable code.");
}
}
就行了,
return putStringItem(itemTag, reference.owner, reference.name, reference.descriptor);
编译器抱怨的itemTag
值可能没有被初始化。对我来说,这似乎很明显,嵌套的switch语句将始终初始化itemTag
的值,因此我很难理解为何生成此错误。编译器是不是足够复杂来评估嵌套的switch语句,还是实际上可能对itemTag
进行初始化?
我目前的解决方案是简单地添加抛出Error
这样一个默认的情况下:
switch (reference.type) {
case FIELD:
itemTag = CONSTANT_Fieldref;
break;
case METHOD:
itemTag = CONSTANT_Methodref;
break;
case INTERFACE_METHOD:
itemTag = CONSTANT_InterfaceMethodref;
break;
default:
throw new Error("Unreachable code.");
}
不过,我觉得这是一个非常丑陋的解决方案。 (更新:我刚刚意识到,我可以用default:
取代case INTERFACE_METHOD:
并仍然得到同样的行为,而不丑我的问题仍然有效,但。)
你可能也注意到了,我已经重新使用该解决方案后在代码中避免必须返回一个值。此开关语句对于在ReferenceType
中定义的每个常量都有一个实例,因此我不完全确定代码如何可能缺少return
语句。
public enum ReferenceType {
CLASS,
FIELD,
METHOD,
INTERFACE_METHOD,
HANDLE,
TYPE
}
为什么编译器会产生这些错误?
为什么不把'int itemTag'放在开关外,然后摆脱嵌套? –