[英]Why Dead Code Warning?
我有:
if (Constants.IS_LIVE_MOD == false)
account = Constants.OM_ACCOUNT;
else
account = "abc";
我在“其他”上收到死代碼警告。 為什么會這樣,而 wat 是它的解決方案。 請幫忙。
我假設IS_LIVE_MOD
常量是一個聲明為 false 的最終變量,如果是,則該變量始終為 false 並且無法更改,因此永遠不會調用 else 語句。 因此它是死代碼。
例如
private static final boolean MY_VAR = false;
if(MY_VAR == false) {
System.out.println("Always does this");
}
else {
System.out.println("Dead code");
}
如果IS_LIVE_MOD
是值為false
的編譯時常量,則編譯器知道永遠不會采用“else”路徑,因此會發出警告。 (Java 語言規范保證不會出錯,但警告你是合理的。)
如果Constants.IS_LIVE_MOD
是一個常量並且它的值為 false,那么編譯器就知道 else 永遠不會被執行。
你不能把它當作一個常數。
您正在相互比較兩個常量( Constants.IS_LIVE_MOD
和false
)。 由於它們是恆定的,因此可以在編譯時確定結果。 所以編譯器可以知道哪個部分永遠不會被執行。
條件if (Constants.IS_LIVE_MOD == false)
始終評估為true
。 因此永遠不會達到else
。
這意味着 Constants.IS_LIVE_MOD 始終等於 false; 所以 else 子句永遠不會被執行; 因此死代碼警告。
警告的含義應該很清楚:代碼不會被執行 - 已經死了 - 因為 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: 無法訪問的語句
如果刪除比較,編譯器會將其識別為“條件編譯”並且不會顯示該警告。
理由(JLS):
為了讓 if 語句方便地用於“條件編譯”目的
如果Constants.IS_LIVE_MOD
是常量(顧名思義)並且為 false,則 else 子句永遠不可能運行; 這使它成為死代碼。
由於 IS_LIVE_MOD 是一個常量,編譯器發現它也將是錯誤的,並且永遠不會使用 else 部分(除非您更改常量,否則它會反過來)。
別擔心。 忽略或抑制警告(方法上的@SuppressWarnings("all")
,不幸的是必須全部,我認為)。
如果你有“真正的”死代碼,它會出錯。
Constants.IS_LIVE_MOD
是如何聲明的? 如果它是一個final
字段,那么編譯器很可能會將此表達式優化為始終為真。
我想說寫這個最有效的方法是這樣的:
account = Constants.IS_LIVE_MOD ? "abc"
: Constants.OM_ACCOUNT;
我猜 Constants.IS_LIVE_MOD 是一個編譯時常量,其值設置為 false。 它變成了
if (false == false)
account = Constants.OM_ACCOUNT;
else
account = "abc";
您可以忽略警告,因為 Java 似乎不支持條件編譯Java 條件編譯:如何防止編譯代碼塊?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.