【问题标题】:Java - Uninitialized final variable of type does not produce error when perform assignmentJava - 未初始化的最终类型变量在执行赋值时不会产生错误
【发布时间】:2022-09-25 16:58:20
【问题描述】:

所以我正在清理我的代码并将final 关键字添加到任何可能的位置,其中一个位置恰好是enum 类型的未初始化变量。

该变量未初始化,因为它的值需要由switch 语句确定。在这种情况下,将这个变量设置为final 是没有意义的,但无论如何我还是意外地这样做了,并且发现代码可以正常工作而不会产生任何错误。

据我了解,Java 中未初始化的变量将保持默认值(在这种情况下我认为应该是null),并且最终变量不能重新分配给不同的对象。

为什么这段代码不会产生任何错误或副作用?


笔记:

  • NeighborPosition 是枚举类型

final NeighborPosition edgePosition;
switch(cornerPosition) {
    case ONE:
        edgePosition = NeighborPosition.THREE;
        break;
    case TWO:
        edgePosition = NeighborPosition.FOUR;
        break;
    case THREE:
        edgePosition = NeighborPosition.FIVE;
        break;
    case FOUR:
        edgePosition = NeighborPosition.SIX;
        break;
    case FIVE:
        edgePosition = NeighborPosition.ONE;
        break;
    case SIX:
        edgePosition = NeighborPosition.TWO;
        break;

    case ZERO:
    default: {
        throw new IllegalStateException(
            \"Should never reach this corner, current corner: \"
            + cornerPosition);
    }
}
  • \"Java 中未初始化的变量将保持默认值\" <- 这仅适用于类字段。局部变量没有默认值。
  • 没有错误,因为您的开关将为每个可能的流分配一个值或引发异常。
  • 感谢@OHGODSPIDERS 的解释,我认为这是我困惑的最大原因。

标签: java enums variable-assignment final


【解决方案1】:

默认情况下不初始化局部变量,只有字段。

在所有可能的情况下,您的代码要么为edgePosition 赋值,要么抛出异常(在这种情况下,局部变量超出范围)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多