/ / Чому це для заяви показує Мертвий код на 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, щоб побачити, що це насправді каже

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