1

単語を繰り返し処理し、そのさまざまなバリエーションをすべて出力したいと考えています。コードを書きましたが、何らかの理由でStringIndexOutOfBoundsException.

public class Test {
public static void main(String[] args) {

    String word = "telecommunications"; // loop thru this word

    for (int i = 0; i < word.length(); i++) {
        for (int j = 0; j < word.length(); j++) {
            System.out.println(word.substring(i, j + 1)); 
                        //This will print out all the different variations of the word 

        }
    }
}

}

このエラーが発生する理由を教えてください。

4

4 に答える 4

1

Java (およびほとんどの言語) では、配列はゼロベースであることを思い出してください。
これは、長さが の文字列がある場合N、インデックスは から - の合計になることを0意味N - 1しますN

この行を見てください:

System.out.println(word.substring(i, j + 1)); 

文字列の長さは 18 で、インデックスは 0 から 17 です。

jiこのインデックスで実行されますが、最後の反復で実行するとどうなりますj + 1か?
- を取得します17 + 1。これは 18 であり、範囲外です。

 j  | char at j
----+-------------
 0  |     t
 1  |     e
... |    ...
... |    ...
17  |     s
18  |    :(

解決策については説明しませんが、なぜこれが起こっているのかがわかれば簡単です。

于 2013-10-12T11:45:25.250 に答える
0

私はあなたがこのようなことをしたいと思う

for (int i = 0; i < word.length(); i++) {
    for (int j = i; j <= word.length(); j++) { // Change here
        System.out.println(word.substring(i, j));  // Change here
                    //This will print out all the different variations of the word
    }
}

最後のインデックスでアクセスしようとするj+1と、配列、配列リスト、または文字列でアクセス可能な最大のインデックスが常に長さn-1nあるため、インデックスが範囲外になるため、例外が発生します。

于 2013-10-12T11:43:39.357 に答える
0

例外の理由は ですword.substring(i, j + 1)i=1&を繰り返し処理してj=17いるとします。その場合、位置 1 から位置までの部分文字列を抽出しようとしていますが、i+j+1 = 19th文字列は 18 文字または位置しか保持していません。

于 2013-10-12T11:47:57.257 に答える
0

word.substring(i, j + 1) ここで、j の値は i の値より大きくなければなりません。最初の 2 回の反復は正常に動作するため、3 回目の反復 i=2 j=0 はその時点で word.substring(2, 0 + 1) この条件で String index out of range: -1 が来るのは、単語に戻ることができないためです部分文字列。2 番目の引数は最初の引数より大きくなければなりません

于 2013-10-12T12:09:50.143 に答える