Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EclipseIDEProblems部分中的死代码是什么意思_Java_Eclipse - Fatal编程技术网

Java EclipseIDEProblems部分中的死代码是什么意思

Java EclipseIDEProblems部分中的死代码是什么意思,java,eclipse,Java,Eclipse,我正在使用EclipseHeliosIDE进行Web应用程序开发。 在Eclipse的Problems部分下,对于某些行,描述显示为“死代码” 谁能告诉我死代码到底是什么意思 请查看屏幕截图以供参考 例如,该部分在Eclipse下显示为死代码 else { int length; if (ar != null) length = Array.getLength(ar); else length =

我正在使用EclipseHeliosIDE进行Web应用程序开发。 在Eclipse的Problems部分下,对于某些行,描述显示为“死代码”

谁能告诉我死代码到底是什么意思

请查看屏幕截图以供参考

例如,该部分在Eclipse下显示为死代码

 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 }