Индекс X выходит за пределы длины X

Я изучаю Java и при изучении методов столкнулся с ошибкой. Более того, код делает то, что я хочу (отображает звездочки), но также выдает ошибку. Я не совсем знаю, почему.

Вот код и ошибка ниже:

import java.util.Scanner;

public class TaskMethods {
    
    //Display the stars
    public static void main (String[] args){
        System.out.println("Insert number of stars:");

    //declare numbers of stars
        int num = getInt();

    //Display the stars by 'stars' method
        System.out.println(stars(num));
    }
    //method for input int variables
    public static int getInt(){
        return new Scanner(System.in).nextInt();
    }

    //method for inputing stars to array and also for displaying them.
    public static String stars(int num){
        String[] star = new String[num];
        for (int i = 0; i < star.length; i++){
            star[i] = "*";
            System.out.print(star[i]);
        }
        return star[num];
    }
}

введите здесь описание изображения

Я пытался ограничить цикл длиной массива (как всегда) и ничего. Нет строки, где мы объявляем значения вне диапазона массива. В каждом посте, который я видел, проблема заключалась в неправильном диапазоне.

Вот почему я ищу помощи здесь.

Массивы проиндексированы [0...num), поэтому num выходит за пределы. Посмотрите еще раз диапазон i в методе stars, обратите внимание, как он заканчивается на i < stars.length. Почему ты возвращаешься star[num] потом?

orhtej2 12.06.2023 12:03

В чем смысл return star[num];? Создавать локальный массив, а затем возвращать только один элемент, не имеет большого смысла. Этот метод должен либо возвращать весь созданный вами массив, либо вообще ничего не возвращать и просто печатать напрямую. Я бы также рекомендовал прочитать Различия между System.out.println() и return в Java

OH GOD SPIDERS 12.06.2023 12:07

Когда я искал ответ, я видел эту тему, но не нашел ответа. Теперь я вижу свои ошибки (Спасибо всем, кто комментирует). Когда я вернусь домой, я исправлю код и вставлю его снова.

Adix 12.06.2023 13:34

@ Адикс, что ты имеешь в виду? Пожалуйста, не редактируйте свой вопрос, чтобы включить фиксированный код. Если вы считаете, что ваш вопрос не дублируется, вставьте исправленный код вместе с некоторыми пояснениями в качестве ответа.

orhtej2 12.06.2023 13:53

@ orhtej2 извините за введение в заблуждение, я имел в виду именно то, что вы написали.

Adix 12.06.2023 14:11

Кстати, вы можете использовать Arrays.fill(star, "*"); для заполнения массива... и вы, вероятно, захотите вернуть массив, а не только один его элемент

user16320675 12.06.2023 14:31

Без предварительного выделения массива вы также можете заполнить звезды с помощью String[] stars = Stream.generate(() -> "*").limit(num).toArray(String[]::new);

WJS 12.06.2023 19:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Скажем, ваш массив имеет длину 3. У вас будут звезды со звездой [0], звездой [1] и звездой [2]. В методе звезд вы возвращаете звезду [3], а этого не существует.

Ответ принят как подходящий

Вы пытаетесь получить доступ к звездочке[num], которая будет равна 1 за пределами последнего проиндексированного значения.

return star[num];

Кроме того, здесь вы предоставляете возвращаемое значение метода stars для вызова println.

//Display the stars by 'stars' method
System.out.println(stars(num));

В этом нет необходимости, так как звезды используют печать для отображения значения.

Есть два подхода, которые вы можете использовать.

Во-первых, просто вызовите stars(num), без вызова println.
Это также позволит вам удалить возвращаемый тип звездочек, изменив его на пустоту.

//method for inputing stars to array and also for displaying them.
public static void stars(int num){
    String[] star = new String[num];
    for (int i = 0; i < star.length; i++){
        star[i] = "*";
        System.out.print(star[i]);
    }
}

Или вы можете заполнить строковое значение звездами и вернуть его.

public static String stars(int num){
    String[] star = new String[num];
    String string = "";
    for (int i = 0; i < star.length; i++){
        star[i] = "*";
        string += star[i];
    }
    return string;
}

Впоследствии вы можете уменьшить назначение строки и звездочки [i] в ​​цикле for.

string += star[i] = "*";

И, поскольку мы в теме, вы можете использовать метод Arrays#fill для заполнения массива и метод String#join для объединения значений.

public static String stars(int num){
    String[] star = new String[num];
    Arrays.fill(star, "*");
    return String.join("", star);
}

Кроме того, метод String#repeat может создавать последовательность повторяющихся символов.

public static String stars(int num){
    return "*".repeat(num);
}

Вот пример ввода и вывода.

Insert number of stars:
5
*****

Другие вопросы по теме