/ / Защо това за изявление показва Dead code в Java? - Java, масиви

Защо това за изявление показва Dead code в Java? - java, масиви

В този клас дефинирах конструкторинициализира масив и го запълва с Point2D.Double. Искам да дефинирам метод toString, който извежда Point2D.Double в масива. Така че в рамките на метода toString, аз правя за цикъл, който връща всеки Point2D.Double в масива. Проблемът е, че не знам защо Eclipse ми казва, че актуализацията в изявлението е мъртъв код.

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

Отговори:

5 за отговор № 1

Аз също бях озадачен от това. (А другите отговори!) Така че аз го изрязах и залепих в Eclipse, за да видя какво всъщност казва.

И какво е Eclipse всъщност казва това i++ е недостижим в този ред.

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

И всъщност това е вярно! Ако някога влезете в тялото на контура, тялото ще се върне безусловно. Следователно i++ никога не могат да бъдат изпълнени.

Имайте предвид също, че това е предупреждение, а не грешка. Този код не е невалиден според правилата на JLS за недостъпност.


Прав сте да бъдете озадачени от другите обяснения. Финалът return изявлението е достъпно. Помислете за случая, когато класът е инстанциран с отрицателна стойност за n (или size). В този случай for тялото на контура никога няма да бъде изпълнено и контролът ще отиде на финала return.

Въпреки това техните предложения за това как да се реши проблемът са правилни. Не трябва да имате return в тялото на контура.


4 за отговор № 2

Проблемът е, защото return изявление в for контур. Запомнете, когато използвате return, веднага прекратявате метода и спрете да изпълнявате някакъв код. Това означава, че вашият toString Методът ще се върти точно само веднъж, връща се само vertices[0], Второто връщане под цикъла никога няма шанс да се изпълни, така че се счита за мъртъв код.

Това всъщност е неправилно! виждам Отговорът на Стефан за по-добро / точно обяснение на това какво се случва.

Независимо от това, все още трябва да коригирате кода си. Вместо да върнете нещо в цикъла, вероятно искате да го направите комбайн стойностите и ги връщат наведнъж в самия край. Лесен начин да направите това може да бъде:

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

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

return output;
}

Сега, вместо да се връщаме незабавно, ние натрупване стойности в цикъла и връщане в самия край.

(Обърнете внимание, че кодът тук не е много ефективен - вероятно ще искате да използвате нещо като String.join или StringBuilder вместо това, но ако сте начинаещ, това работи сега)