我正在尝试第一次切割字符串。
使用此代码,如果我输入,例如'一二三',它可以正常工作,直到最后一个字。 这是输出的最后几行:
当前的词是thr
句子现在是
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
at java.lang.String.substring(String.java:1907)
at TestCurr.main(testCurrentWord.java:18)
有没有人知道为什么这样做到最后一个字?
class TestCurr
{
public static void main (String []args)
{
String s;
int i;
String currentWord;
int length;
int spacePos;
System.out.println("Enter a sentence ");
s = EasyIn.getString();
spacePos = s.indexOf(" ");
length = s.length();
for (i = length -1; i >= 0; i--)
{
currentWord = s.substring(0,spacePos);
s = s.substring(spacePos +1);
System.out.println("Current word is " + currentWord);
System.out.println("Sentence is now " + s);
}
}
}
答案 0 :(得分:4)
首先,你打电话
spacePos = s.indexOf(" ");
length = s.length();
只有一次,但这些值应该随着循环的每次迭代而改变。此外,
s.substring(spacePos +1);
带
spacePos == s.length()-1
表示您将索引超出字符串末尾作为start
的{{1}}索引。修复第一个错误后,这将是您的下一个例外。
答案 1 :(得分:2)
您的问题是您只获得一次空间索引。这导致程序每三个字符剪切一次字符串,因为第一个字是三个字母长。您需要在每次迭代后更新spacePos。
答案 2 :(得分:1)
我认为您的问题在于使用spacePos
变量。
在循环外部,您可以像这样初始化变量:
spacePos = s.indexOf(" ");
在你的示例字符串“一二三”中,产生3。
但是在你的循环中,你永远不会再根据你没有处理过的东西再次设置变量。
尝试在循环内重新计算spacePos
的值,您的问题就会消失。
答案 3 :(得分:1)
您当前的方法太容易出错。 你有太多的变数。
尝试这个只是一个想法。
class TestCurr {
public static void main(String[] args) {
String s = null;
System.out.println("Enter a sentence: ");
s = " one two three ";
System.out.println("|" + s + "|");
int i = 0;
int j = 0;
while (true){
while (i<s.length() && s.charAt(i)==' ') i++;
j = i;
if (i>=s.length()) break;
while (i<s.length() && s.charAt(i)!=' ') i++;
System.out.println("Current word is: [" + s.substring(j, i)+ "]");
System.out.println("Sentence is now: [" + s.substring(i) + "]");
if (i>=s.length()) break;
}
}
}
答案 4 :(得分:0)
正如其他人所说,你只能获得一次索引。但我很好奇,为什么重新发明轮子?
String s = "one two three";
String[] split = s.split(" ");
for (String out : split) {
System.out.println("Word: " + out);
}