简单的数组循环问题

时间:2013-12-20 01:02:12

标签: java arrays loops

这是我现在的代码

for (int i = 0; i <= listOfPeople.length; i++){
    String name = scnr.nextLine();
    System.out.println("Person " + (i + 1) +  ": ");
    listOfPeople[i] = name;
}

人员列表是一个正确声明的字符串列表,其长度为用户发送的值。发生的错误是当我运行程序时,我得到了这个:

Person 1: 

Jordan

Person 2: 

Jordan

Person 3:

Jordan

Person 4: 

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    at RGG.main(RGG.java:20)

我不太确定出了什么问题,但我已经尝试在for循环声明中删除=,然后我得到了这个输出:

Person 1: 

Jordan

Person 2: 

Jordan

Person 3: 

在第三次提示后,代码继续进行,我无法输入任何内容。 有谁知道可能会发生什么?提前谢谢!

4 个答案:

答案 0 :(得分:2)

删除此表达式=中的i <= listOfPeople.length;。它导致您访问不存在的数组元素。

for (int i = 0; i < listOfPeople.length; i++){
        String name = scnr.nextLine();
        System.out.println("Person " + (i) +  ": ");
        listOfPeople[i] = name;
}

完整示例:

public class PersonArrayTest {

    public static void main(String[] args) {
        String[] listOfPeople = new String[5];
        assign(listOfPeople);
        System.out.println(Arrays.toString(listOfPeople));
    }

    public static void assign(String[] listOfPeople) {

        Scanner scnr = new Scanner(System.in);
        for (int i = 0; i < listOfPeople.length; i++) {
            String name = scnr.nextLine();
            System.out.println("Person " + (i) + ": ");
            listOfPeople[i] = name;
        }
    }
}

答案 1 :(得分:2)

使用此行

for (int i = 0; i <= listOfPeople.length; i++){

你正在推进一个超出数组末尾的长度为3的有效索引0-2。 3是无效索引。

删除=后,您将获得更正后的版本:

for (int i = 0; i < listOfPeople.length; i++){

在运行数组末尾之前,在2迭代之后停止,这是数组的结尾。

答案 2 :(得分:1)

更改此<=登录for循环

for (int i = 0; i < listOfPeople.length; i++)

答案 3 :(得分:0)

我做了一个有根据的猜测,你正在使用Scanner#nextInt来获取数组长度的输入。有点像这样:

String[] listOfPeople = new String[scnr.nextInt()];

我已经获得了这个,因为你的循环代码看起来像这样:

take input for i == 0
print prompt #1
take input for i == 1
print prompt #2
take input for i == 2
print prompt #3

但是你的输出显示了这个:

print prompt #1
take input for i == 1
print prompt #2
take input for i == 2
print prompt #3

所以实际上必须发生的是:

silently advance past whatever scnr is still retaining for i == 0
print prompt #1
take input for i == 1
print prompt #2
take input for i == 2
print prompt #3

nextInt孤立一个换行符。 (除了nextLine之外,还会调用next_。)这就是为什么跳过你的第一个输入。在循环的第一次迭代中调用scnr.nextLine只会使扫描程序超过最后一行。

将循环更改为:

// skip the last new line
scnr.nextLine();

// < not <=
for (int i = 0; i < listOfPeople.length; i++) {

    // prompt before input
    System.out.println("Person " + (i + 1) +  ": ");

    // you don't need that extra String
    listOfPeople[i] = scnr.nextLine();
}