У цьому класі я визначив конструктор, якийініціалізує масив і заповнить його 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, щоб побачити, що це насправді каже
І що таке затемнення насправді говорить, що це 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, але якщо ви новачок, це працює зараз)