为什么Java会抱怨一个未初始化的变量,即使每个可能的路径都指向它';s的初始化已处理?

为什么Java会抱怨一个未初始化的变量,即使每个可能的路径都指向它';s的初始化已处理?,java,null,switch-statement,Java,Null,Switch Statement,考虑这一点: class BlackMage { public void castSpell(SPELL_TYPE spellType) { Spell spell; if (spellType == null) return; switch(spellType) { case FIRE: spell = new Fire();

考虑这一点:

class BlackMage {
    public void castSpell(SPELL_TYPE spellType) {
        Spell spell;

        if (spellType == null)
            return;

        switch(spellType) {
            case FIRE:
                spell = new Fire();
                break;
            case BLIZZARD:
                spell = new Blizzard();
                break;
            case THUNDER:
                spell = new Thunder();
                break;
        }

        // use spell
    }

    enum SPELL_TYPE {
        FIRE,
        BLIZZARD,
        THUNDER
    }
}

除非我在
开关中添加
default
块并在那里初始化拼写,否则编译器会抱怨拼写没有初始化。我不明白为什么,因为我们处理了所有3种可能性。

编译器没有检查枚举有多少值


您的交换机没有默认情况,这将删除错误。用默认值替换最后一个案例,或者简单地添加一个额外的默认块,该块分配任意随机值;您知道它永远不会计算,但编译器不会

编译器没有进入检查枚举有多少值的级别


您的交换机没有默认情况,这将删除错误。用默认值替换最后一个案例,或者简单地添加一个额外的默认块,该块分配任意随机值;您知道它永远不会计算,但编译器不会

您说您有3个case,但编译器对此不确定,谁知道您是否会从3个case中传递值。如果出于某种原因,您在这里输入了三分之一的值,则不会初始化
拼写
,因为java enum开关未初始化exhaustive@user2478398即使我对待空它仍然会抱怨。请参阅编辑。假设您的枚举位于名为
a.jar
的库中,而此代码位于
b.jar
中。
a.jar
的创建者使用新的枚举值发布新版本。由于
b.jar
不会被重新编译,现在我们有一个未初始化的变量大小写,这是绝对不允许的。@EdwinDalorzo-Hmm这是有道理的。您说您有3个大小写,但编译器不确定,谁知道您是否会从3个大小写中传递值。如果出于某种原因,您在这里输入了三分之一的值,则不会初始化
拼写
,因为java enum开关未初始化exhaustive@user2478398即使我对待空它仍然会抱怨。请参阅编辑。假设您的枚举位于名为
a.jar
的库中,而此代码位于
b.jar
中。
a.jar
的创建者使用新的枚举值发布新版本。由于不会重新编译
b.jar
,现在我们有了一个未初始化的变量大小写,这是绝对不允许的。@EdwinDalorzo-Hmm这很有意义。