if (Constants.IS_LIVE_MOD == false)
account = Constants.OM_ACCOUNT;
else
account = "abc";
我在'else'上收到了死警告。为什么会这样,而wat就是它的解决方案。请帮忙。
答案 0 :(得分:10)
我假设IS_LIVE_MOD
常量是一个声明为false的最终变量,如果是,则变量总是为false且不能更改,因此将永远不会调用else语句。因此它是死代码。
E.g。
private static final boolean MY_VAR = false;
if(MY_VAR == false) {
System.out.println("Always does this");
}
else {
System.out.println("Dead code");
}
答案 1 :(得分:5)
如果IS_LIVE_MOD
是编译时常量且值为false
,则编译器知道“else”路径永远不会采取,所以给你一个警告。 (Java语言规范保证它不会是错误,但警告你是合理的。)
答案 2 :(得分:5)
如果Constants.IS_LIVE_MOD
是常量且其值为false,则编译器知道其他内容永远不会被执行。
你不能把它作为常数。
答案 3 :(得分:3)
您正在将两个常量(Constants.IS_LIVE_MOD
和false
)相互比较。由于它们是常量,因此可以在编译时确定结果。所以编译器可以告诉哪个部分永远不会被执行。
答案 4 :(得分:2)
条件if (Constants.IS_LIVE_MOD == false)
始终评估为true
。因此永远不会达到else
。
答案 5 :(得分:2)
这意味着 Constants.IS_LIVE_MOD 总是等于假;所以else子句永远不会执行;因此死码警告。
答案 6 :(得分:2)
警告的含义应该是明确的:代码不会被执行 - 已经死了 - 因为IS_LIVE_MOD是常量,但这是一个解决方案(解决方法):
if (!Constants.IS_LIVE_MOD)
account = Constants.OM_ACCOUNT;
else
account = "abc";
或
if (Constants.IS_LIVE_MOD)
account = "abc";
else
account = Constants.OM_ACCOUNT;
详情JLS 14.21:Unreachable Statements
如果删除比较,编译器会将其识别为“条件编译”,并且不会显示该警告。
理由(JLS):
为了允许if语句方便地用于“条件编译”目的
答案 7 :(得分:1)
如果Constants.IS_LIVE_MOD
是常量(顾名思义)并且为false,则else子句永远不可能运行;这使它成为死代码。
答案 8 :(得分:1)
由于IS_LIVE_MOD是一个常量,编译器会发现它也是假的,并且else部分永远不会被使用(直到你改变你的常量,然后它将是另一种方式)。
不要担心。忽略或取消警告(方法@SuppressWarnings("all")
,不幸的是,我认为必须是全部。
如果您有“真正的”死代码,则会出错。
答案 9 :(得分:1)
Constants.IS_LIVE_MOD
如何宣布?如果它是final
字段,则编译器很可能优化此表达式以使其始终为真。
答案 10 :(得分:1)
我会说最有效的写作方式是这样的:
account = Constants.IS_LIVE_MOD ? "abc"
: Constants.OM_ACCOUNT;
答案 11 :(得分:1)
我猜Constants.IS_LIVE_MOD是编译时常量,值设置为false。它变成了
if (false == false)
account = Constants.OM_ACCOUNT;
else
account = "abc";
您可以忽略该警告,因为Java似乎不支持条件编译Java conditional compilation: how to prevent code chunks from being compiled?