问题描述
我正在做一些应该是微不足道的事情 - 从属性中检索枚举值并将其与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#),但对的回答表明我对此的理解是合理的。 我正在犯一些愚蠢的错误吗?
1楼
您是否尝试过对此进行调试并验证该块是否从未实际到达?
我同意这是一个非常奇怪的情况。 如果它仍然存在,我可以建议交换int常量的枚举,并对它们进行检查。 这不是一个真正的修复,而是更多的解决方法,但至少它可以暂时取消阻止你。
2楼
编辑:正如@Bubletan和@MarkoTopolnik所提到的,这不会导致编译器错误。 将响应留作不会导致此错误的文档。
你在代码setScanMode
任何地方setScanMode
吗?
(在其他区域之外)。
编译器可能检测到静态变量scanMode从未被修改,因此ScanState.getScanMode()
始终是ScanState.ScanModeEnum.SCAN_IDLE
,因此代码不可访问。
尝试在代码中的某处调用setScanMode
(其值不同于ScanState.ScanModeEnum.SCAN_IDLE
)并查看此错误是否消失。
3楼
好悲伤。 在按照建议制作单独的方法并发现其他地方的问题后,我进一步查看了代码。 完整的方法是;
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
语句确实得到了评??估。
感谢您的评论,我认为这值得离开(尽管确实是一个愚蠢的错误),因为其他人可能会被这个问题所困扰。