Eclipse IDE问题部分中死代码的含义是什么

时间:2012-01-03 14:15:03

标签: java eclipse

我正在使用Eclipse Helios IDE进行Web应用程序开发。 在Eclipse的Problems部分中,对于某些行,描述显示为“Dead Code”。

有人可以告诉我死码究竟是什么意思吗?

请参阅屏幕截图供您参考。

enter image description here

例如,这部分在Eclipse

下显示为死代码
 else {
        int length;
        if (ar != null)
            length = Array.getLength(ar);
        else
            length = 0; // This line is dead code

13 个答案:

答案 0 :(得分:38)

在Eclipse中,“死代码”是永远不会执行的代码。通常情况下,它在逻辑上永远不会输入的条件分支中。

一个简单的例子如下:

boolean x = true;
if (x) {
   // do something
} else {
   // this is dead code!
}

这不是一个错误,因为它仍然是有效的java,但它是一个有用的警告,特别是如果逻辑条件很复杂,并且可能不直观地显示代码将从不执行

在您的特定示例中,Eclipse计算出ar将始终为非null,因此永远不会执行else length = 0分支。

是的,它可能是可能 Eclipse错了,但它更可能不是。

答案 1 :(得分:5)

死代码是永远不会执行的代码,例如

 boolean b = true
 if (!b) {
    .... 
    // dead code here
 }

答案 2 :(得分:4)

死代码意味着无法执行此代码。

有时你甚至无法编译它(比如这种情况:):

private Boolean dead_code()
    {
    return true;
    //Dead code below:
    dosomething();
    }

但在其他情况下,这并不太明显,例如这句话:

   b=true;
   [...]
   if (b==false)
    {
    //Dead code
    }

如果您收到此消息, 代码中存在一些主要缺陷。你必须找到它,否则你的应用程序将无法正常工作。

答案 3 :(得分:2)

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禁止编译器评估变量的“值”。我们可以评估的所有内容都是'nullness'

希望这有帮助

答案 4 :(得分:1)

您可能在“死代码”行上方的行中有一个Null指针异常。 确保检查“空指针”异常。

答案 5 :(得分:0)

您之前可能使用过变量ar。然后编译器知道else语句中的行永远不会被执行。在您使用NullPointerException的地方或ar语句的第一部分将会执行if

答案 6 :(得分:0)

让我给死代码一些答案。

<强>例如

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(&#34; Unreachable line&#34;);从未被执行过。 反过来又认为是死代码。

另一个例子可能是:

int func(int i, int j)
{
int sum = i + j;
return i + j; // never actually using the sum 
}

简单的函数返回i + j;从来没有真正使用总和 Sum在这里被认为是死代码。

答案 7 :(得分:0)

发生这种情况时的其他一些情况。

System.out.println("result :" + result + ":" + result.isEmpty());
if (result == null)
    return result;
else if(!result.isEmpty())
    str.append(result + " ");

1)在这里,当你打印结果并检查isEmpty()时,eclipse假设结果不为null,所以它不会进入if。所以返回结果是死代码。

2)现在让我们说结果是null,所以你会在result.isEmpty()中得到NullPointerException,所以再次它不会进入if并返回结果是死码

要使这项工作只注释掉System.out.println()。

答案 8 :(得分:0)

如果您给出的条件检查可能永远不会满足,则Eclipse会发出此警告。以下是一些例子

Object o=null;
if(o!=null) {
 //Some code

}

此处死代码警告将在Object已经为空

时出现

另一个例子如下:

BSTTest bstTest=null;
bstTest.test=10;
if(bstTest==null) {
  //some code

}

这里的代码试图访问类的变量。由于已经访问了变量,eclipse将在if(bstTest == null)中给出死代码警告,因为当已经访问变量时,bstTest可能不为null。

注意:这里bstTest.test将给出空指针异常

答案 9 :(得分:0)

死代码的简单示例

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");
            }
        }
    }

答案 10 :(得分:0)

为简化术语的“无法访问代码”和“无效代码”:

无法访问的代码是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
    }

答案 11 :(得分:0)

死代码是我们代码中永远不会执行运行时的部分,它毫无用处 例如:

if(false){ // statements }

有关更多示例,您可以参考:DeadCode Examples

答案 12 :(得分:-1)

试试这个:

while (true) {
    if(false == true) break;

}

S.O.P("I will never reach here!") <-- This code will never be executed.

代码是有效的,因为它符合编译器,但实际上循环永远不会退出,实际上S.O.P永远不会被执行。