-1

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

问题是当我运行我的 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

4 回答 4

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 是一个临时数组,它的作用达到了界限。

于 2013-10-28T23:32:57.377 回答
1

您的 PrintArray 方法不会出错,您之前就遇到了错误!

randomString[index] = input;

因为如果你这样做

index <= randomString.length

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

index < randomString.length

您的 ExtendArray 方法也不起作用!

于 2013-10-28T23:33:04.353 回答
0

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

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

于 2013-10-28T23:29:46.513 回答
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 条件也应该是:

while (index < randomString.length)
于 2013-10-28T23:32:55.123 回答