我希望迭代一个单词并打印出它的所有不同变体。我已经编写了代码,但由于某种原因,我继续获得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
}
}
}
}
有人可以告诉我为什么会收到此错误吗?
答案 0 :(得分:1)
请记住,Java(以及大多数语言)中的数组从零开始。
这意味着,如果您有一个长度为N
的字符串,则索引将从0
到N - 1
- 其总和将为N
。
看看这一行:
System.out.println(word.substring(i, j + 1));
字符串的长度为18,索引为0到17。
j
和i
在这些索引上运行,但是在上一次迭代中执行j + 1
会发生什么?
- 你会得到17 + 1
,即18,超出范围。
j | char at j
----+-------------
0 | t
1 | e
... | ...
... | ...
17 | s
18 | :(
我不会告诉你解决方案,但是当你知道为什么会发生这种情况时,它会直截了当。
答案 1 :(得分: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
时,索引超出范围,因为任何数组或arraylist或字符串中的最大可访问索引始终为n-1
其中n
是长度。
答案 2 :(得分:0)
异常的原因是word.substring(i, j + 1)
。
假设,您正在迭代并拥有i=1
&amp; j=17
,在这种情况下,您尝试从位置1开始提取子字符串,直到i+j+1 = 19th
位置,而字符串只保存18个字符或位置。
答案 3 :(得分:0)
因为word.substring(i,j + 1) 这里j值应该大于i值。因为前两次迭代它会正常工作。当第三次迭代时i = 2 j = 0当时word.substring(2,0 + 1)在这种情况下字符串索引超出范围:-1会因为我们不能回字而来子。第二个参数应该大于第一个参数