2011-04-20 82 views

回答

10

它永遠不會執行。有時人們會在他們想要記住一些舊代碼或者一些不應該使用的新代碼時這樣做。像

if(false){fancyNewFunction();} 

(就我而言,這是不好的形式,你不應該這樣做,但是,這並不意味着它不會發生;))

+0

這是比代碼不執行更多。編譯器沒有將字節碼放在類中,因此整個'if'語句被刪除,因此甚至沒有用於測試'false'的週期。 – 2011-04-20 14:13:53

+0

如果測試完成,情況會更糟,但您仍然在使用編譯器的某些功能來保存基本上是註釋的內容。如果您想評論某些內容,請對其進行評論。它更可讀。 – Nanne 2011-04-20 14:35:03

+0

這就是SonarQube有什麼可報告的內容; ;-) – 2017-02-23 01:25:25

1

中,如果當條件爲條件執行代碼真正現在if(false)的條件總是這樣的代碼,如果將永遠不會執行。

if(false){ 

// This code will be dead code and will never execute. 

} 
4

我用

if (false) 
{ 
    doSomething(); 
} 

有時會阻止執行doSomething()

它可能會更好/更清楚這樣做:

final static private boolean ENABLE_WOLZOPPERY = false; 

if (ENABLE_WOLZOPPERY) 
{ 
    wolzopp1(); 
} 
blah_blah_blah(); 
if (ENABLE_WOLZOPPERY) 
{ 
    wolzopp2(); 
} 

,這樣一個常數可以啓用/禁用命名方式不止一個塊的行爲。

+2

爲什麼不直接註釋掉而不是使用if(false)? – Fortega 2011-04-20 12:48:33

+0

@Fortega,因爲這種模式可以通過編輯單行(啓用+1)來啓用/禁用多個代碼塊。 – 2011-04-20 12:58:36

+1

這不僅僅是代碼不執行。編譯器沒有將字節碼放在類中,因此整個'if'語句被刪除,因此甚至沒有用於測試'false'的週期。 – 2011-04-20 14:13:23

1

code in if(false) { code } will never將被執行。

這是「註釋掉」不應該運行的代碼(通常是調試代碼或測試代碼)的常用方法。在我看來,這不是最好的風格,但這是一個很常見的成語。

0

code永遠不會執行,並可能會從字節碼中消除。 但是該代碼段將在構建時進行語法檢查,所以有時候有很好的理由來做到這一點。

0

的,如果裏面的代碼將永遠不會被執行,該代碼可能也只是被註釋掉的代碼進行

+3

不要評論代碼。如果未使用,請將其刪除。 – 2011-04-20 12:54:51

+1

同意 - 這是非常惱人的,不得不挖掘一堆半功能的函數,試圖找出它實際上在做什麼。不幸的是,有些人喜歡使用評論作爲源代碼控制的一種形式。 – 2011-04-20 13:19:41

+0

我不是說我會註釋掉代碼,只是指出如果(false)基本上和註釋一樣有影響 – 2011-04-20 15:46:30

0

這是不正常的代碼,我從來沒有使用的構建喜歡這個。也許一種糟糕的方式來評論一些代碼。

0

如果您在調試器中逐句通過代碼,這可能很方便。

如果您的代碼只是在「監督」時才執行,即您正在使用調試程序並將代碼中的下一個可執行步驟主動設置爲if (false)塊內。通常,當代碼運行時,它將被跳過。

儘管如此,生產代碼並沒有真正的原因。

1

這樣的代碼將永遠不會執行。去掉它。不要評論它。這只是混亂,會讓以後需要維護的人感到困惑。如果您需要恢復它,請轉到您的版本控制系統。

+0

這不僅僅是代碼不會執行。編譯器沒有將字節碼放在類中,因此整個'if'語句被刪除,因此甚至沒有用於測試'false'的週期。所以當使用一個常量時,還有其他原因。尤其是對於需要高性能的循環中的特殊調試代碼。 – 2011-04-20 14:14:45

+0

它仍然增加了代碼,應該刪除。這是分散注意力。 – 2011-04-20 14:39:36

7

這也可能是模擬宏預處理器指令(如#ifdefine)的常用方法。有些人使用它來啓用或禁用日誌記錄。

例如下面的代碼:

public class Sample{ 

    private static final boolean LOG_ENABLED = true; 

    public static void main(String args[]){ 
     if(LOG_ENABLED){ 
      System.out.println("Hello World"); 
     } 
    } 
} 

產生如下的字節碼:

public class Sample extends java.lang.Object{ 
public Sample(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
    3: ldC#3; //String Hello World 
    5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    8: return 

} 

如果禁用標誌,你得到這個字節碼:

public class Sample extends java.lang.Object{ 
public Sample(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: return 

} 

,你可以請參閱主方法中沒有爲第二種情況生成字節碼。因此,如果您禁用日誌記錄並重新編譯代碼,則可以改進基礎字節碼。

+2

+1。其他答案只是說明它「永遠不會執行」並不完全正確。該代碼由編譯器在物理上刪除,並且是Java編譯器規範的一部分。 – 2011-04-20 14:12:18

0

if (false)意味着和平的代碼永遠不會被執行。如果你的一些代碼沒有被使用,你應該刪除它。

使用代碼的唯一原因是調試目的,但我認爲這不是個好主意。現在,當IDE存在時,我們可以選擇代碼塊並按一些快捷鍵來進行多行註釋(對於Eclipse CTRL + /)。

你不應該犯這個代碼,因爲可能會導致很多問題:

  • 很難注意到這個代碼和平永遠不會被執行
  • 我們還必須維護該代碼。
  • 我們不能讓這個
+0

那麼,你會如何'測試覆蓋'這段代碼? – 2011-04-20 14:22:36

+0

如果你不能準備任何測試代碼裏面的和平。這意味着你的內部如果(假)從未被測試過 – smas 2011-04-20 14:37:41