我的PrintList函数的ArrayIndexOutOfBoundsException,我不明白为什么

时间:2013-10-28 23:23:08

标签: java arrays exception for-loop printing

我正在编写一个非常简单的程序,当用户达到当前数组的限制时会自动扩展数组。

问题是当我运行PrintList方法时,我得到了java.lang.ArrayIndexOutOfBoundsException,我真的不知道为什么。如果我使用一个大于数组的随机数(例如500),它的工作正常,但如果我使用

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

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

我得到一个令人讨厌的异常。我如何处理这个以及为什么我首先得到它?

非常感谢你的帮助!

这是我的程序的源代码:

public static void main(String[] args) {
    Scanner keyboard = new Scanner(System.in);
    int index = 0;
    String[] randomString = new String[1];

    while (index <= randomString.length) {

        out.println("Enter your string");
        String input = keyboard.next();
        randomString[index] = input;
        PrintArray(randomString);
        index++;

        if (index >= randomString.length) {
            ExtendArray(randomString);
            continue;
        }
    }
}

public static void ExtendArray(String[] stringArray) {

    String[] secondArray = new String[stringArray.length * 2];
    // Copy first array into second array
    for (int i = 0; i < stringArray.length; i++) {
        stringArray[i] = secondArray[i];
        stringArray = secondArray;
    }
}

public static void PrintArray(String[] stringArray) {
    for (int i = 0; i < stringArray.length; i++) {
        out.println(" " + stringArray[i]);
    }
}

4 个答案:

答案 0 :(得分:2)

Java不适用于您尝试使用的方法。 Java中的所有内容都是按值传递的,除非它是对象中的数据点。您尝试使用的是通过引用传递,这在Java中是不可能的。

您要做的是一个名为Vector的现有数据结构:http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html

我建议这样做:(不确定它是否能正常工作,因为我目前的PC没有开发工具):

public static String[] ExtendArray(String[] stringArray) {

    String[] secondArray = new String[stringArray.length * 2];
    // Copy first array into second array
    for (int i = 0; i < stringArray.length; i++) {
        secondArray[i] = stringArray[i];
    }

    return secondArray;
}

然后在main中调用它:

randomString = ExtendArray(randomString);

关于向量,这是它在Vector类中的工作方式:

public void incrementCount(int count){
    int increment = (count * 2);
    Object newElementData [] = new Object[increment];
    for(int i = 0; i < count; i++)
    {
        newElementData[i] = elementData[i];
    }

    elementData = new Object[increment];

    elementData = newElementData;
}

在这种情况下,elementData是原始数组,newElementData是一个临时数组,用于提升边界。

答案 1 :(得分:1)

你的PrintArray方法无法得到错误,你之前就会收到错误!

randomString[index] = input;

因为如果你这样做

index <= randomString.length

最后一次迭代超出范围,长度为10的字符串的值为0-9。您必须将while循环更改为

index < randomString.length

你的ExtendArray方法也不起作用!

答案 2 :(得分:0)

您应该将randomString数组替换为具有双倍长度的新数组。您创建一个新数组并将旧数组的内容复制到新数组,但不要对新数组执行任何操作。

我想你希望ExtendArray方法返回新数组,并将randomString变量设置为新数组。

答案 3 :(得分:0)

您需要从ExtendArray函数返回第二个数组:

public static String[] ExtendArray(String[] stringArray) {

    String[] secondArray = new String[stringArray.length * 2];
    // Copy first array into second array
    for (int i = 0; i <= stringArray.length; i++) {
        stringArray[i] = secondArray[i];
    }
    return secondArray;
}

并在你的主要:

randomString = ExtendArray(randomString);

同样的条件应该是:

while (index < randomString.length)