簡體   English   中英

為什么是死代碼警告?

[英]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_MODfalse )。 由於它們是恆定的,因此可以在編譯時確定結果。 所以編譯器可以知道哪個部分永遠不會被執行。

條件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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM