Я изучаю 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];
}
}
введите здесь описание изображения
Я пытался ограничить цикл длиной массива (как всегда) и ничего. Нет строки, где мы объявляем значения вне диапазона массива. В каждом посте, который я видел, проблема заключалась в неправильном диапазоне.
Вот почему я ищу помощи здесь.
В чем смысл return star[num];? Создавать локальный массив, а затем возвращать только один элемент, не имеет большого смысла. Этот метод должен либо возвращать весь созданный вами массив, либо вообще ничего не возвращать и просто печатать напрямую. Я бы также рекомендовал прочитать Различия между System.out.println() и return в Java
Когда я искал ответ, я видел эту тему, но не нашел ответа. Теперь я вижу свои ошибки (Спасибо всем, кто комментирует). Когда я вернусь домой, я исправлю код и вставлю его снова.
@ Адикс, что ты имеешь в виду? Пожалуйста, не редактируйте свой вопрос, чтобы включить фиксированный код. Если вы считаете, что ваш вопрос не дублируется, вставьте исправленный код вместе с некоторыми пояснениями в качестве ответа.
@ orhtej2 извините за введение в заблуждение, я имел в виду именно то, что вы написали.
Кстати, вы можете использовать Arrays.fill(star, "*"); для заполнения массива... и вы, вероятно, захотите вернуть массив, а не только один его элемент
Без предварительного выделения массива вы также можете заполнить звезды с помощью String[] stars = Stream.generate(() -> "*").limit(num).toArray(String[]::new);




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