在这个类中,我定义了一个构造函数,它初始化一个数组并用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 "";
}
答案 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的内容,但如果您是初学者,则此功能现在适用)