【问题标题】:Why this for statement shows Dead code in Java?为什么这个 for 语句显示 Java 中的死代码?
【发布时间】:2014-09-14 02:29:37
【问题描述】:

在这个类中,我定义了一个构造函数,它初始化一个数组并用 Point2D.Double 填充它。我想定义一个在数组中输出 Point2D.Double 的 toString 方法。所以在 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 "";
}

【问题讨论】:

  • See.
  • 更改你的 toString(): 1) 创建一个新变量 String s = ""; 2) 将 'return "" + vertices[i]' 更改为 s += vertices[i];, 3) 循环完成后, @987654325 @

标签: java arrays


【解决方案1】:

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

而 Eclipse 实际上说的是 i++ 在这一行中是无法访问的。

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

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

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


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

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

【讨论】:

    【解决方案2】:

    问题在于for 循环中的return 语句。请记住,无论何时使用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 之类的东西,但如果您是初学者,现在可以使用)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 2015-01-08
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多