是什么,如果(假){一些代码}意味着在java中

问题描述:

Java代码是什么,如果(假){一些代码}意味着在java中

if(x == null){ 
//some code 
} 
if(false){ 
//some code 
} 

if(false){code}执行时?

+0

什么问题?答案当然是测试范围:切勿 – 2011-04-20 13:22:40

它永远不会执行。有时人们会在他们想要记住一些旧代码或者一些不应该使用的新代码时这样做。像

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

中,如果当条件为条件执行代码真正现在if(false)的条件总是这样的代码,如果将永远不会执行。

if(false){ 

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

} 

我用

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

code in if(false) { code } will never将被执行。

这是“注释掉”不应该运行的代码(通常是调试代码或测试代码)的常用方法。在我看来,这不是最好的风格,但这是一个很常见的成语。

code永远不会执行,并可能会从字节码中消除。 但是该代码段将在构建时进行语法检查,所以有时候有很好的理由来做到这一点。

的,如果里面的代码将永远不会被执行,该代码可能也只是被注释掉的代码进行

+3

不要评论代码。如果未使用,请将其删除。 – 2011-04-20 12:54:51

+1

同意 - 这是非常恼人的,不得不挖掘一堆半功能的函数,试图找出它实际上在做什么。不幸的是,有些人喜欢使用评论作为源代码控制的一种形式。 – 2011-04-20 13:19:41

+0

我不是说我会注释掉代码,只是指出如果(false)基本上和注释一样有影响 – 2011-04-20 15:46:30

这是不正常的代码,我从来没有使用的构建喜欢这个。也许一种糟糕的方式来评论一些代码。

如果您在调试器中逐句通过代码,这可能很方便。

如果您的代码只是在“监督”时才执行,即您正在使用调试程序并将代码中的下一个可执行步骤主动设置为if (false)块内。通常,当代码运行时,它将被跳过。

尽管如此,生产代码并没有真正的原因。

这样的代码将永远不会执行。去掉它。不要评论它。这只是混乱,会让以后需要维护的人感到困惑。如果您需要恢复它,请转到您的版本控制系统。

+0

这不仅仅是代码不会执行。编译器没有将字节码放在类中,因此整个'if'语句被删除,因此甚至没有用于测试'false'的周期。所以当使用一个常量时,还有其他原因。尤其是对于需要高性能的循环中的特殊调试代码。 – 2011-04-20 14:14:45

+0

它仍然增加了代码,应该删除。这是分散注意力。 – 2011-04-20 14:39:36

这也可能是模拟宏预处理器指令(如#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

if (false)意味着和平的代码永远不会被执行。如果你的一些代码没有被使用,你应该删除它。

使用代码的唯一原因是调试目的,但我认为这不是个好主意。现在,当IDE存在时,我们可以选择代码块并按一些快捷键来进行多行注释(对于Eclipse CTRL + /)。

你不应该犯这个代码,因为可能会导致很多问题:

  • 很难注意到这个代码和平永远不会被执行
  • 我们还必须维护该代码。
  • 我们不能让这个
+0

那么,你会如何'测试覆盖'这段代码? – 2011-04-20 14:22:36

+0

如果你不能准备任何测试代码里面的和平。这意味着你的内部如果(假)从未被测试过 – smas 2011-04-20 14:37:41