当前位置: 代码迷 >> java >> Android Studio使用枚举比较报告“无法访问的代码”
  详细解决方案

Android Studio使用枚举比较报告“无法访问的代码”

热度:102   发布时间:2023-08-02 11:08:13.0

我正在做一些应该是微不足道的事情 - 从属性中检索枚举值并将其与if语句中的枚举常量进行比较。 然而,Android Studio声称true情况是无法访问的代码,不会编译。

该块是:

if (ScanState.getScanMode() != ScanState.ScanModeEnum.SCAN_IDLE)
{
    //We're already scanning, but user wants to stop.
    stopScanning();
}
else
{
    ScanState.setScanMode(newMode);
    restartScan();
    buttonFlashMode = btnMode;
    buttonFlasher();
}

在一个额外的ScanState类中,我有:

public static ScanModeEnum getScanMode() {
    return scanMode;
}

public static void setScanMode(ScanModeEnum scanMode) {
    ScanState.scanMode = scanMode;
}

public enum ScanModeEnum
{
    SCAN_IDLE,
    SCAN_PERSON,
    SCAN_BIKE,
    SCAN_SEARCH
}

private static ScanModeEnum scanMode = ScanModeEnum.SCAN_IDLE;

我尝试过的变种,Android Studio声称它们都将评估为false

if(ScanState.getScanMode() == ScanState.ScanModeEnum.SCAN_IDLE)
if(ScanState.getScanMode().compareTo(ScanState.ScanModeEnum.SCAN_IDLE)!=0)
if(ScanState.ScanModeEnum.SCAN_IDLE == ScanState.ScanModeEnum.SCAN_IDLE)
if(ScanState.ScanModeEnum.SCAN_IDLE.equals(ScanState.ScanModeEnum.SCAN_IDLE))

我是Java新手(更熟悉C#),但对的回答表明我对此的理解是合理的。 我正在犯一些愚蠢的错误吗?

您是否尝试过对此进行调试并验证该块是否从未实际到达?

我同意这是一个非常奇怪的情况。 如果它仍然存在,我可以建议交换int常量的枚举,并对它们进行检查。 这不是一个真正的修复,而是更多的解决方法,但至少它可以暂时取消阻止你。

编辑:正如@Bubletan和@MarkoTopolnik所提到的,这不会导致编译器错误。 将响应留作不会导致此错误的文档。

你在代码setScanMode任何地方setScanMode吗? (在其他区域之外)。 编译器可能检测到静态变量scanMode从未被修改,因此ScanState.getScanMode()始终是ScanState.ScanModeEnum.SCAN_IDLE ,因此代码不可访问。 尝试在代码中的某处调用setScanMode (其值不同于ScanState.ScanModeEnum.SCAN_IDLE )并查看此错误是否消失。

好悲伤。 在按照建议制作单独的方法并发现其他地方的问题后,我进一步查看了代码。 完整的方法是;

public void onScanButtonPress(@ButtonFlashMode int button)
{
    ScanState.ScanModeEnum newMode;
    @ButtonFlashMode int btnMode = 0;

    switch (button)
    {
        case FLASH_BIKE:
            newMode = ScanState.ScanModeEnum.SCAN_BIKE;
            btnMode = FLASH_BIKE;

        case FLASH_PERSON:
            newMode = ScanState.ScanModeEnum.SCAN_PERSON;
            btnMode = FLASH_PERSON;

        default:
            //Unhandled.
            return;
    }

    if (ScanState.getScanMode() != ScanState.ScanModeEnum.SCAN_IDLE)
    {
        //We're already scanning, but user wants to stop.
        stopScanning();
    }
    else
    {
        ScanState.setScanMode(newMode);
        restartScan();
        buttonFlashMode = btnMode;
        buttonFlasher();
    }
}

由于我忘记在交换机的情况下放置break语句,它总是会在if之前被评估。 因此它永远不会评估为true ,因此错误是正确的 - 如果误导,因为它暗示(至少对我来说!) if语句确实得到了评??估。 感谢您的评论,我认为这值得离开(尽管确实是一个愚蠢的错误),因为其他人可能会被这个问题所困扰。

  相关解决方案