Eclipse IDE 问题部分下的死代码是啥意思
Posted
技术标签:
【中文标题】Eclipse IDE 问题部分下的死代码是啥意思【英文标题】:what does Dead Code mean under Eclipse IDE Problems SectionEclipse IDE 问题部分下的死代码是什么意思 【发布时间】:2012-01-03 14:15:03 【问题描述】:我正在使用 Eclipse Helios IDE 进行 Web 应用程序开发。 在 Eclipse 的问题部分下,对于某些行,描述显示为“死代码”。
谁能告诉我死代码到底是什么意思?
请查看屏幕截图以供参考。
比如这部分在Eclipse下显示为死代码
else
int length;
if (ar != null)
length = Array.getLength(ar);
else
length = 0; // This line is dead code
【问题讨论】:
大概是因为它可以证明ar
永远不会在那里为空 - 没有更多代码我们不能肯定地说(但否则它会是一个错误,我更倾向于搜索对于代码中的错误,而不是 eclipse 编译器中的错误;))
值得注意的是——Eclipse 有时会出错。我已经看到 Eclipse Neon 对可证明没有死的代码给出“死代码”错误。
【参考方案1】:
在 Eclipse 中,“死代码”是永远不会执行的代码。通常它在逻辑上永远不会进入的条件分支中。
一个简单的例子如下:
boolean x = true;
if (x)
// do something
else
// this is dead code!
这不是错误,因为它仍然是有效的 java,但它是一个有用的警告,尤其是在逻辑条件很复杂的情况下,并且代码可能不会在直观上明显永远被执行.
在您的具体示例中,Eclipse 计算出ar
将始终为非空,因此永远不会执行else length = 0
分支。
是的,可能Eclipse 是错误的,但更可能的是它不是。
【讨论】:
我已经修改了我的问题,我的问题是请告诉我 Eclipse 如何确定这是死代码?因为在我看来 Eclipse 的建议可能也是错误的知道吗?? @skaffman,是否已删除死代码以使其不会出现在字节码中?【参考方案2】:死代码是永远不会被执行的代码,例如
boolean b = true
if (!b)
....
// dead code here
【讨论】:
【参考方案3】:死代码意味着,这段代码不可能被执行。
有时你甚至无法编译它(像这种情况:)
private Boolean dead_code()
return true;
//Dead code below:
dosomething();
但在其他情况下,这不是很明显,例如以下语句:
b=true;
[...]
if (b==false)
//Dead code
如果您收到此消息,则说明您的代码存在一些重大缺陷。您必须找到它,否则您的应用将无法按预期运行。
【讨论】:
我喜欢您的第一个示例,但不同意“存在一些重大缺陷”。不一定是这样,例如我经常使用静态布尔“调试”参数,只有当参数设置为 true 时才会执行一些代码。对于版本,我将参数更改为 false,结果我收到很多死代码警告,因为“调试”代码部分永远不会被执行。 你说得对,我没有想到这个案子。这确实会导致大量死代码。【参考方案4】:Eclipse 给出了两种诊断,用于标记在运行时将/可能不会执行的代码。 1) 无法访问的代码:这些是遵循 JLS 的无法访问规则的常见 java 警告,也是由 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
上面给出的示例不应给出死代码警告。即
boolean x = true;
if (x)
// do something
else
// this is dead code!
不应给出警告,因为 JLS 禁止编译器评估变量的“值”。我们可以评估的只是“空性”
希望对你有帮助
【讨论】:
【参考方案5】:您可能在“死代码”行上方的行中遇到空指针异常。 确保检查“空指针”异常。
【讨论】:
我还要说:您可能有一个编译器明显的空指针异常:),即如果您的代码肯定会导致在发出该警告的行上出现空指针异常,那么即使编译器理解这一点。【参考方案6】:您之前可能使用过变量ar
。然后编译器就知道 else 语句中的那一行永远不会被执行。在您使用ar
的地方将有一个NullPointerException
,或者将执行if
语句的第一部分。
【讨论】:
【参考方案7】:让我为死代码给出一些答案。
例如:
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("Unreachable line");永远不会被执行。 这又被认为是死代码。
另一个例子可能是:
int func(int i, int j)
int sum = i + j;
return i + j; // never actually using the sum
简单函数返回i + j;从来没有真正使用过总和。 Sum 在这里被认为是死代码。
【讨论】:
【参考方案8】:发生这种情况的其他情况。
System.out.println("result :" + result + ":" + result.isEmpty());
if (result == null)
return result;
else if(!result.isEmpty())
str.append(result + " ");
1) 在这里,您正在打印结果并检查 isEmpty() eclipse 假定结果不为空,因此它不会进入 if。所以返回结果是死代码。
2) 现在假设结果为 null,因此您将在 result.isEmpty() 中获得 NullPointerException,因此如果返回结果为死码,它将不会进入
要完成这项工作,只需注释掉 System.out.println()。
【讨论】:
【参考方案9】:如果您提供的条件检查可能永远不会得到满足,Eclipse 会发出此警告。以下是一些例子
Object o=null;
if(o!=null)
//Some code
这里会出现死代码警告,因为 Object 已经设为 null
下面给出另一个例子
BSTTest bstTest=null;
bstTest.test=10;
if(bstTest==null)
//some code
这里的代码试图访问类的变量。由于变量已经被访问,eclipse会在if(bstTest==null)中给出死代码警告,因为当变量已经被访问时,bstTest可能不为空。
注意:这里bstTest.test会给出空指针异常
【讨论】:
【参考方案10】:死代码的简单示例
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");
【讨论】:
【参考方案11】:为了简化术语的 Unreachable code 和 dead code:
无法访问的代码是 Java 中的代码块/语句,控件在程序的生命周期内永远不会到达并且永远不会被执行。以下是无法访问代码的示例。这会产生编译时错误。
public void unreachableCodeExample()
System.out.println("This will execute");
return;
System.out.println("This will not"); //This is Unreachable code
While A Dead 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
【讨论】:
【参考方案12】:死代码是我们代码中永远不会执行运行时的部分,它没用 例如:
if(false) // statements
更多例子你可以参考:DeadCode Examples
【讨论】:
【参考方案13】:试试这个:
while (true)
if(false == true) break;
S.O.P("I will never reach here!") <-- This code will never be executed.
代码是有效的,因为它符合编译器,但实际上循环永远不会退出,实际上 S.O.P 永远不会被执行。
【讨论】:
以上是关于Eclipse IDE 问题部分下的死代码是啥意思的主要内容,如果未能解决你的问题,请参考以下文章