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,则索引将从0N - 1- 总和为N

看看这一行:

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

你的字符串的长度是 18,索引是从 0 到 17。

j并在此索引上运行,但是在最后一次迭代中i会发生什么? - 你会得到,这是 18,这是超出范围的j + 1
17 + 1

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

我不会告诉你解决方案,但是当你知道为什么会发生这种情况时,它是直截了当的。

于 2013-10-12T11:45:25.250 回答
0

异常的原因是word.substring(i, j + 1)。假设您正在迭代并拥有i=1& j=17,在这种情况下,您试图从位置 1 开始提取子字符串,直到i+j+1 = 19th位置,而您的字符串仅包含 18 个字符或位置。

于 2013-10-12T11:47:57.257 回答
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-1在哪里。n

于 2013-10-12T11:43:39.357 回答
0

因为 word.substring(i, j + 1) 这里 j 值应该大于 i 值。因为前两次迭代它会正常工作。当第三次迭代 i=2 j=0 时 word.substring(2, 0 + 1) 在这种情况下 String index out of range: -1 will come because we can't go back word子串。第二个参数应该大于第一个参数

于 2013-10-12T12:09:50.143 回答