索引 X 超出长度 X 的边界 [重复]

Index X out of bounds for length X [duplicate]

提问人:Adix 提问时间:6/12/2023 更新时间:6/13/2023 访问量:113

问:

我正在学习 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];
    }
}

在此处输入图像描述

我试图按数组长度限制循环(像往常一样),但没什么。 没有一行我们声明数组范围之外的值。 在我看到的每篇文章中,问题都是错误的范围。

这就是我在这里寻求帮助的原因。

Java 字符串 循环 方法

评论

0赞 orhtej2 6/12/2023
数组是索引的,所以是越界的。再看一遍 in 方法的范围,注意它是如何终止于 的。你为什么之后会回来?[0...num)numistarsi < stars.lengthstar[num]
0赞 6/12/2023
有什么意义?创建一个本地数组,然后只返回一个元素是没有意义的。该方法应该要么返回您创建的整个数组,要么根本不返回任何内容,而直接打印。我还建议阅读 System.out.println() 和 Java 中的 return 之间的差异return star[num];
0赞 Adix 6/12/2023
当我在寻找答案时,我看到了这个话题,但我没有找到答案。现在我看到了我的错误(感谢所有评论的人)。当我回到家时,我会更正代码并再次粘贴。
0赞 orhtej2 6/12/2023
@Adix什么意思?请不要编辑您的问题以包含固定代码。如果您觉得您的问题不是重复的,那么请将修改后的代码与一些解释一起粘贴作为答案。
1赞 Adix 6/12/2023
@orhtej2很抱歉误导,我的意思是你写的。

答:

0赞 Pol 6/12/2023 #1

假设您的数组长度为 3。您将在 star[0]、star[1] 和 star[2] 处拥有星星。 在 stars 方法中,你返回 star[3],而这并不存在。

0赞 Reilas 6/12/2023 #2

您正在尝试访问 star[num],它将是最后一个索引值之外的 1。

return star[num];

此外,您还在此处向 println 调用提供 stars 方法的返回值。

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

这不是必需的,因为星星使用打印来显示值。

您可以采取两种方法。

第一,只需调用 stars(num),无需 println 调用。
这还允许您删除形的返回类型 - 通过将其更改为 void

//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]);
    }
}

或者,您可以在星形中填充一个 String 值,然后返回该值。

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;
}

随后,您可以在 for 循环中减少 stringstar[i] 赋值。

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
*****