java.lang.ArrayIndexOutOfBoundsException:while循环中的3

时间:2015-09-09 16:17:18

标签: java arrays string while-loop

我一直在接受这个例外,我不知道如何修复它:

java.lang.ArrayIndexOutOfBoundsException: 3
while循环中

。这是我的代码:

public class NameSearch {
    static String[] names = new String[3];

    void populateStringArray() {
        names[0] = "Ben";
        names[1] = "Thor";
        names[2] = "Zoe";
        names[3] = "Kate";
    }

    public static void main(String[] args) {
        String pName;
        int max = 4;
        int current = 1;
        boolean found = false;

        Scanner scan = new Scanner(System.in);
        System.out.println("What player are you looking for?");
        pName = scan.next();
        while (found == false && current <= max) {
            if (names[current] == pName) {
                found = true;
            } else {
                current = current + 1;
            }
        }
        if (found == true) {
            System.out.println("Yes, they have a top score");
        } else {
            System.out.println("No, they do not have a top score");
        }
    }
}

该代码旨在要求用户输入一个名称,它将检查该名称是否在数组中(简而言之)。

我的IDE(Eclipse)说错误在于if (names[current] == pName){行。

2 个答案:

答案 0 :(得分:2)

下面:

static String[] names = new String[3];

您正在使用三个项目的容量初始化一个数组,而不是最大索引3.要获得包含0,1,2和3的数组,这四个项目,所以你需要像这样初始化数组:

static String[] names = new String[4]; // (0-3)

此外,循环和数组是从零开始的,因此您希望以current 0开始而不是1来循环遍历数组。
此外,最后,您需要在while循环中将<=切换为<,因为我们希望它最多只能达到3。

答案 1 :(得分:2)

当您需要在14(包括)之间对其进行索引时,您正在03(包括)之间的循环中索引数组元素

current更改为0开始,将max更改为3,您应该一切顺利。

对于可能更好的替代方案,请考虑将您的名单列表放在HashSet中,而不需要进行迭代。 E.g。

Set<String> names = new HashSet<String>();
names.add("Ben");
names.add("Thor");
names.add("Zoe");
names.add("Kate");

if (names.contains(pName)) {
//...

如果名称的排序很重要,那么您可以使用List代替,contains方法也有Map方法(通常效率不如O(n)实施方式.. O(1) vs ^(?![IVX.]|[a-z)]).*$ 通常)。如果列表中的名称数量很少,或者性能不是问题,那么无论哪种方式都无关紧要。