В този клас дефинирах конструкторинициализира масив и го запълва с 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 вместо това, но ако сте начинаещ, това работи сега)