出于测试目的,我经常开始在现有项目中输入一些代码。因此,我想要测试的代码位于所有其他代码之前,如下所示:
public static void main(String[] args)
{
char a = '%';
System.out.println((int)a);
// To know where '%' is located in the ASCII table.
// But, of course, I don't want to start the whole project, so:
return;
// The real project starts here...
}
但是编译器会抱怨
return
语句,因为存在以下“死代码”。 (而在 C++ 中,编译器服从程序员并简单地编译 return 语句)
为了防止编译器抱怨,我写了一个愚蠢的
if
语句:
if (0 != 1) return;
我讨厌它。为什么编译器不能按照我的要求做?是否有一些编译标志或注释或其他内容可以解决我的问题?
没有任何标志可以关闭此行为。使死代码成为编译时错误的规则是JLS(§14.21 无法访问语句)的一部分,并且无法关闭。
循环中存在一个明确的漏洞,允许这样的代码:
if (true) return;
someOtherCode(); // this code will never execute, but the compiler will still allow it
这是显式完成的,以允许“注释掉”或条件编译(取决于某些
static final boolean
标志)。
如果您好奇:该漏洞是基于以下事实:在检查
if
语句内或之后的代码的可达性时,if
语句的条件表达式的已知常量值不会被考虑。类似的情况也发生在 while
上,其中考虑了已知常数值 ,因此此代码将无法编译:
while (true) return;
someOtherCode(); // this will be flagged as an unreachable statement
你的项目中不应该有很多死代码,但是我有两种方法可以解决这个问题以进行原型设计。
// But, of course, I don't want to start the whole project, so:
/*
// The real project starts here...
*/
}
或创建第二种方法。
// But, of course, I don't want to start the whole project, so:
// realProject();
}
public static void realProject()
// The real project starts here...
}