5

我想写一些故障排除代码,我可以很容易地从我的程序以后的非调试版本中删除它们。我想出了:

final static boolean debug_on=true;
...
if (debug_on) { system.out.println() or logger.log(...) }

如果 debug==false,Java 是否足够聪明,可以从最终字节码中删除 if 语句?

是否有更好的做法来实现将调试代码排除在程序最终版本之外的目标?

4

1 回答 1

5

请参阅Java 语言规范第 14.21 章的结尾。Unreachable Statements 的描述if(false)

if (false) { x=3; }

不会导致编译时错误。优化编译器可能会意识到该语句x=3;将永远不会被执行,并且可能会选择从生成的类文件中省略该语句的代码,但在x=3;此处指定的技术意义上,该语句不被视为“不可访问”。

这种不同处理的基本原理是允许程序员定义“标志变量”,例如:

static final boolean DEBUG = false;

然后编写代码,例如:

if (DEBUG) { x=3; }

这个想法是应该可以将 DEBUG 的值从 false 更改为 true 或从 true 更改为 false,然后正确编译代码,而不需要对程序文本进行其他更改。

tl;博士; 这取决于编译器是否在字节码中省略了 if 中的语句。

于 2013-04-09T15:57:13.847 回答