对于建议抛出异常的人:
抛出异常不会给我一个编译时错误,它会给我一个运行时错误.我知道我可以抛出一个异常,我宁愿在编译期间死也不会在运行时死掉.
首先,我使用的是eclipse 3.4.
我有一个数据模型,其模式属性是枚举.
enum Mode {on(...), off(...), standby(...); ...}
Run Code Online (Sandbox Code Playgroud)
我目前正在写这个模型的视图,我有代码
...
switch(model.getMode()) {
case on:
return getOnColor();
case off:
return getOffColor();
case standby:
return getStandbyColor();
}
...
Run Code Online (Sandbox Code Playgroud)
我收到错误"此方法必须返回类型java.awt.Color的结果",因为我没有默认情况,并且在函数末尾没有返回xxx. 我想在有人为枚举添加另一种类型的情况下出现编译错误(例如关闭)所以我不想放置抛出AssertionError的默认情况,因为这将使用修改后的模式进行编译而不会被视为错误直到运行时.
我的问题是:
为什么EclipseBuilder(和javac)没有意识到这个开关涵盖了所有可能性(或者它是否涵盖了它们?)并且停止警告我需要返回类型.有没有办法,我可以做我想要的,而无需向Mode添加方法?
如果失败了,是否有一个选项可以在不包含所有Enum可能值的switch语句上发出警告/错误?
编辑:Rob:这是一个编译错误.我只是尝试用javac编译它,我得到一个"缺少返回语句"错误,目标是方法的最后一个}.Eclispe只是将错误放在方法的顶部.
我有几个switch语句测试一个enum.enum必须通过switch语句在语句中处理所有值case.在代码重构期间,可能会发生enum收缩和增长.当enum收缩时,编译器会抛出错误.但是,如果enum增长,则不会抛出任何错误.匹配状态被遗忘并产生运行时错误.我想将此错误从运行时移动到编译时.从理论上讲,应该可以enum在编译时检测丢失的情况.有没有办法实现这个目标?
问题已经存在" 如何检测新值已添加到枚举中并且未在交换机中处理 "但它不包含仅与Eclipse相关的解决方案的答案.
是否有注释或其他方法将非详尽的switch语句警告转换为错误?如果没有在开关中正确处理所有值,我想要某个方法或类产生错误.
例:
public enum E {
A,
B
}
Run Code Online (Sandbox Code Playgroud)
在代码的其他地方,有一个像这样的枚举的开关
switch (enumValue) {
case A: /* do something */ break;
}
Run Code Online (Sandbox Code Playgroud)
Java会向您发出警告,指示此开关不处理所有枚举值.我想将此警告变为错误(永久,无论各个IDE设置如何).
请记住,在这种情况下我无法更改原始文件enum,所以我希望编译器强制执行它.