为什么这个for语句在Java中显示死代码?

时间:2014-09-14 02:29:37

标签: java arrays

在这个类中,我定义了一个构造函数,它初始化一个数组并用Point2D.Double填充它。我想定义一个toString方法,输出数组中的Point2D.Double。所以在toString方法中,我创建一个for循环,返回数组中的每个Point2D.Double。问题是,我不知道为什么Eclipse告诉我for语句中的更新是死代码。

import java.awt.geom.Point2D;


public class SimplePolygon {

    public int n; // number of vertices of the polygon
    public Point2D.Double[] vertices; // vertices[0..n-1] around the polygon
                                // boundary

public SimplePolygon(int size) {
    n = size;
    vertices = new Point2D.Double[n]; // creates array with n size. Elements are doubles.
    for(int i = 0; i < n; i++)
    {
        Point2D.Double point = new Point2D.Double(Math.random() * 6, Math.random() * 6);
        vertices[i] = point;
    }

}

public String toString() {
    for(int i = 0 ; i < n ; i++)
    {
        return "" + vertices[i];
    }

    return "";
}

2 个答案:

答案 0 :(得分:5)

我也对此感到困惑。 (以及其他答案!)所以我将其剪切并粘贴到Eclipse中,以查看它实际所说的内容。

Eclipse 实际所说的是i++在此行中无法访问。

   for(int i = 0 ; i < n ; i++)

事实上,这是正确的!如果你进入循环体,身体将无条件地返回。因此i++永远不会被执行。

另请注意,这是警告而非错误。根据有关不可达性的JLS规则,此代码无效。


你对其他解释感到困惑是正确的。最终的return语句是可以访问的。考虑使用n(或size)的负值实例化类的情况。在这种情况下,for循环体将永远不会被执行,控制将转到最终return

但是,他们关于如何解决问题的建议是正确的。你不应该在循环体中有return

答案 1 :(得分:4)

问题是因为return循环中的for语句。请记住,无论何时使用return,您都会立即结束该方法并停止运行任何代码。这意味着您的toString方法只会完全循环一次,只返回vertices[0]。循环下面的第二个返回永远不会有执行的机会,所以被认为是死代码。

这实际上是不正确的!请参阅Stephan's answer,以便更好/准确地了解正在进行的操作。

无论如何,您仍需要修复代码。您可能希望组合值并在最后一次返回所有值,而不是在循环内返回某些内容。一个简单的方法可能是:

public String toString() {
    String output = "";

    for(int i = 0 ; i < n ; i++)
    {
        output += vertices[i] + " ";
    }

    return output;
}

现在,我们不是立即返回,而是在循环中累积值并在最后返回。

(请注意,此处的代码效率不高 - 您可能希望使用类似String.join或StringBuilder的内容,但如果您是初学者,则此功能现在适用)