我有这个代码:
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.");
}
但是,我觉得这是一个非常丑陋的解决方案。 ( 更新 :我刚刚意识到我可以用
case INTERFACE_METHOD:
替换 default:
并且仍然得到相同的行为而没有丑陋。我的问题仍然存在。)您可能还注意到,我稍后在代码中重新使用了此解决方案,以避免返回值。此 switch 语句对
ReferenceType
中定义的每个常量都有一个案例。 ,所以我不完全确定代码如何丢失 return
陈述。public enum ReferenceType {
CLASS,
FIELD,
METHOD,
INTERFACE_METHOD,
HANDLE,
TYPE
}
为什么编译器会产生这些错误?
最佳答案
编译器不会查看你的 switch 语句来查看你是否初始化了变量。如果它没有在当前范围内初始化(例如,在您创建变量的 switch 语句之外),您将收到此错误。这样做的目的是防止您稍后在代码中调用该变量时调用“null”。
如果您知道在 switch 语句中它总是被设置为正确的值,那么用任意值初始化变量应该是安全的。这是否是最优雅的解决方案还有待商榷,但它应该可以解决您的问题。我认为这比处理像你这样的错误更好。
编辑:
关于问题的后半部分,我认为创建一个在正确范围内返回的变量可以解决您的问题。例如。如果您初始化一个变量(再次使用任意值),那么您可以在 switch 语句中使用正确的值设置它,然后在方法结束时返回该变量。那应该摆脱错误。
关于java - switch 语句中的这个值如何被未初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39682208/