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

次に、メインで次のように呼び出します。

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 に答える