Java EclipseIDEProblems部分中的死代码是什么意思
我正在使用EclipseHeliosIDE进行Web应用程序开发。 在Eclipse的Problems部分下,对于某些行,描述显示为“死代码” 谁能告诉我死代码到底是什么意思 请查看屏幕截图以供参考 例如,该部分在Eclipse下显示为死代码Java EclipseIDEProblems部分中的死代码是什么意思,java,eclipse,Java,Eclipse,我正在使用EclipseHeliosIDE进行Web应用程序开发。 在Eclipse的Problems部分下,对于某些行,描述显示为“死代码” 谁能告诉我死代码到底是什么意思 请查看屏幕截图以供参考 例如,该部分在Eclipse下显示为死代码 else { int length; if (ar != null) length = Array.getLength(ar); else length =
else {
int length;
if (ar != null)
length = Array.getLength(ar);
else
length = 0; // This line is dead code
在Eclipse中,“死代码”是永远不会执行的代码。通常它位于一个条件分支中,逻辑上永远不会被输入
下面是一个简单的例子:
boolean x = true;
if (x) {
// do something
} else {
// this is dead code!
}
这不是一个错误,因为它仍然是有效的java,但它是一个有用的警告,特别是在逻辑条件复杂的情况下,并且从直觉上看,代码可能永远不会执行
在您的特定示例中,Eclipse计算出ar
将始终为非null,因此永远不会执行else length=0
分支
是的,Eclipse有可能是错的,但很可能不是。死代码是永远不会执行的代码,例如
boolean b = true
if (!b) {
....
// dead code here
}
死代码意味着无法执行此代码 有时甚至无法编译它(如本例:) 但在其他情况下,这并不太明显,例如:
b=true;
[...]
if (b==false)
{
//Dead code
}
如果您有此消息,则代码中存在一些主要缺陷。您必须找到它,否则您的应用程序将无法正常工作。Eclipse提供了两种诊断方法,用于标记运行时将/可能不会执行的代码。 1) 不可访问代码:这些是通常的java警告,遵循JLS的不可访问性规则,也由javac给出。这些都是编译错误。示例:
int foo() {
return 1;
int i = 1; // Unreachable
}
int foo2() {
while (true);
int i =1; //Unreachable
}
还有其他更复杂的例子:)
2) 死代码:这是Eclipse自己的静态分析警告,并且大部分与空分析无关,即
void foo() {
Object o = null;
if (o == null) {
} else {
// dead code
}
上面给出的示例不应给出死代码警告。i、 e
boolean x = true;
if (x) {
// do something
} else {
// this is dead code!
}
不应发出警告,因为JLS禁止编译器计算变量的“值”。我们所能计算的只是“空值”
希望这有帮助您可能在“死代码”行上方的行中出现空指针异常。 确保检查“空指针”异常 试试这个:
while (true) {
if(false == true) break;
}
S.O.P("I will never reach here!") <-- This code will never be executed.
while(true){
如果(假==真)中断;
}
S.O.P(“我永远不会到达这里!”)您可能以前使用过变量
ar
。然后编译器知道else语句中的行永远不会执行。在使用ar
的位置将出现NullPointerException
,或者将执行if
语句的第一部分 让我为死代码给出一些答案
例如:
public class UnreachableTest{
public static void main(){
try{
// some code
}
catch(Exception exc){
throw new NullPointerException();
System.out.println("Unreachable line"); // compile time error
}
}
}
这里是System.out.println(“不可访问行”);永远不会被执行。
这反过来又被认为是一个死代码
另一个例子可能是:
int func(int i, int j)
{
int sum = i + j;
return i + j; // never actually using the sum
}
简单函数返回i+j;从不真正使用总和。
在这里,总和被认为是死代码。当这种情况发生时,还有一些其他情况
System.out.println("result :" + result + ":" + result.isEmpty());
if (result == null)
return result;
else if(!result.isEmpty())
str.append(result + " ");
1) 在这里,当您打印结果并检查isEmpty()时,eclipse假定结果不是空的,所以如果是空的,它将不会进入。所以返回的结果是死代码
2) 现在假设result为null,那么您将在result.isEmpty()中获得NullPointerException,所以如果返回的结果是死代码,它也不会进入
要实现这一点,只需注释掉System.out.println()。如果您提供的条件检查可能永远无法满足,Eclipse将发出此警告。下面是一些例子
Object o=null;
if(o!=null) {
//Some code
}
在这里,死代码警告将出现,因为对象已设为空
下面给出了另一个例子
BSTTest bstTest=null;
bstTest.test=10;
if(bstTest==null) {
//some code
}
这里的代码试图访问类的变量。由于变量已经被访问,eclipse将在if(bstest==null)中发出死代码警告,因为当变量已经被访问时,bstest可能不为null
注意:这里bstest.test将给出空指针异常死代码的简单示例
public class IfTest {
public static void main(String[] args) {
if (true) {
if(false) {
System.out.println("a"); //Dead code, Never be Execute this if block.
}else {
System.out.println("b");
}
}
}
要简化术语的不可访问代码和死代码,请执行以下操作:
不可访问代码是Java中的一个代码块/语句,在程序的生命周期内,控件从未到达该代码块/语句,也从未执行过该代码块/语句。下面是无法访问代码的示例。这将生成编译器时间错误
public void unreachableCodeExample() {
System.out.println("This will execute");
return;
System.out.println("This will not"); //This is Unreachable code
}
虽然死代码是无法访问的代码,但它不会生成编译时错误。但如果您在eclipse(或其他IDE)中执行它,它会给您一个警告。参见下面的示例
public void deadCodeExample() {
if (true) {
System.out.println("This will execute");
return;
}
System.out.println("This will not"); //This is dead code
}
死代码是我们代码中永远不会在运行时执行的部分,它是无用的
例:
您可以参考更多示例:我修改了我的问题,我的问题是请告诉我Eclipse如何判断这是死代码??因为在我看来Eclipse的建议也可能是错误的,知道吗???@skaffman,死代码被删除了吗,这样它就不会出现在字节码中?大概是因为它可以证明,ar
在那里永远不会为空-没有更多的代码,我们无法确定(但如果不是这样的话,这将是一个bug,我更倾向于在代码中搜索bug,而不是在eclipse编译器中搜索。)值得注意的是,eclipse有时会出错。我看到EclipseNeon对可证明没有死的代码给出了“死代码”错误。我喜欢您的第一个示例,但不同意“存在一些主要缺陷”。这不一定如此,例如,我经常使用静态布尔“debug”参数,该参数只有在参数设置为true时才会执行某些代码。对于发布版,我将参数更改为false,因此我得到了大量死代码警告,因为“调试”代码部分将永远不会执行。这确实是大量死代码的结果。我还想说:您可能有一个编译器
public void deadCodeExample() {
if (true) {
System.out.println("This will execute");
return;
}
System.out.println("This will not"); //This is dead code
}
if(false){ // statements }