java - switch 语句中的这个值如何被未初始化?

标签 java compiler-errors switch-statement

我有这个代码:

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/

相关文章:

c++ - 错误-根据g++未声明继承的类字段

java - 带有字符和ascii值的开关大小写在java中表现相同

java - 如何在java中的while循环中设置switch语句

java - 如何在JFormDesigner中添加滚动条?

java - 我需要明确关闭连接吗?

java - 如何在 Spring Data 中通过示例对查询的两个日期之间的范围添加限制

Java switch语句处理两个变量?

java - 使用操作更新另一个类中的实例变量

ios - 'GPUImageOutput<GPUImageInput>' 没有可见的@interface 声明选择器 'imageFromCurrentlyProcessedOutputWithOrientation:'

c++ - 如何使用父目录中的文件进行命令行编译?