我遇到一个问题,该变量正在枚举的开关内初始化。 Android Studio(和 Eclipse)似乎忽略了我在 所有 情况下初始化变量的事实,并声明:“变量 'x' 可能尚未初始化”。我不想设置默认情况。
代码示例:
public enum eTest {
One,
Two
}
public class Test {
public void method(eTest value) {
String toPrint;
switch (value) {
case One:
toPrint = "One";
break;
case Two:
toPrint = "Two";
break;
}
System.out.println(toPrint); // <-- said error
}
}
我不想初始化变量,但我不确定是否有一种方法可以在不初始化的情况下执行此操作(我喜欢知道我错了)。 假设这是不可能的,我想确保新的枚举值必须添加到这个开关。
第一次尝试:
I've tried adding the "Enum 'switch' statement that misses case" to the Android Studio settings ,但这有两个问题:
- 构建不会失败(仅显示带有红色标记的位置)。
- 这取决于本地配置,我想要一些可以对所有用户强制执行的东西。
第二次尝试:
我发现这应该可以通过 build.gradle 文件中的 lintOptions 实现(如前所述,我使用的是 Android Studio),但是我无法使其按预期工作。我在 build.gradle 中添加了以下选项:
lintOptions {
enable 'EnumSwitchStatementWhichMissesCases'
abortOnError true
}
这并没有奏效,我假设是因为两个可能的问题:
- 名字是错误的(我是从Android Studio在使用settings时创建的xml中拿来的)。
- 此问题的默认严重性是警告而非错误,但我找不到如何更改问题的严重性。
第三次尝试:
It should be possible to add a lint.xml to the Android Studio project ,我也试过了,但它没有使构建失败,所以我假设我在那里做错了什么。我将以下内容放在 AndroidManifest 位置:
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="EnumSwitchStatementWhichMissesCases" severity="error" />
</lint>
此外:
我看过this answer ,但这不是我要找的,因为这是关于特定构建过程的,所以我希望有更好的解决方案。
问题:
是否可以:
1. 解决原来的问题。 编辑: 这是做不到的(感谢 Blackbelt - 请参阅下面的评论)
如果没有:
2. 将上述选项添加到构建过程(欢迎任何可以对其他用户强制执行的选项)。
编辑: 说明 - 我想知道如何在 Android Studio 中使用 lint 防止枚举在编译时丢失大小写
最佳答案
此错误来自 Java 编译器,而不是来自 IntelliJ IDEA 检查或 Android linter。如果您使用命令行 Java 编译器编译常规 Java 类(非 Android),您将看到完全相同的错误。因此,您修复它的所有尝试都不起作用。 EnumSwitchStatementWhichMissesCases
检查检测到一种不同类型的问题,这种情况不会发生。
Java编译器之所以会报错,是因为Java支持类的单独编译。即使现在您的 switch 涵盖了枚举的所有可能情况,枚举类也有可能在稍后重新编译并包含其他条目,这些条目不会由您的 switch 处理。
因此,即使将未知的枚举条目传递给方法,您也需要确保变量已初始化。您可以通过向变量声明添加初始化器或向开关添加 default
分支(分支中的代码可以简单地抛出错误)来实现此目的。
关于android - 枚举中的变量初始化,或在编译时防止枚举丢失案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29589954/