我遇到一个变量问题,该变量正在枚举内的交换机内进行初始化。似乎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
}
这不起作用,我假设是因为两个可能的问题:
第三次尝试:
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,如何防止在编译时丢失案例的枚举
答案 0 :(得分:1)
此错误来自Java编译器,而不是来自IntelliJ IDEA检查或Android linter。如果使用命令行Java编译器编译常规Java类(非Android),您将看到完全相同的错误。因此,您没有尝试修复它。 EnumSwitchStatementWhichMissesCases
检查会检测到在这种情况下不会发生的其他类型的问题。
Java编译器将此报告为错误的原因是因为Java支持单独编译类。即使现在您的开关涵盖了枚举的所有可能情况,但是枚举类可能会在以后重新编译,并且将包含其他条目,这些条目将不会被您的交换机处理。
因此,即使将未知的枚举条目传递给方法,也需要确保变量已初始化。您可以通过向变量声明添加初始化程序或向交换机添加default
分支来执行此操作(分支中的代码只会引发错误)。
答案 1 :(得分:0)
创建默认案例。
enum myEnum(one, two, error)
String toPrint;
switch (myEnum)
{
case(one):
toPrint = "one";
break;
case (two):
toPrint = "two";
break;
default:
toPrint = "error";
}