Java String.charAt() 抛出 java.lang.StringIndexOutOfBoundsException
Java String.charAt() throws java.lang.StringIndexOutOfBoundsException
下面的代码应该给我一个由句子中 space 之后的所有字符连接而成的字符串:
public class Main {
public static void main (String[] args) {
System.out.println(generateFromSentence("Hello World!"));
}
public static String generateFromSentence(String sentence) {
String output = String.valueOf(sentence.charAt(0));
for (int i = 0; i <= sentence.length(); i++) {
if (sentence.charAt(i) == ' '){
String following = String.valueOf(sentence.charAt(i+1));
output = output.concat(following);
}
}
return output;
}
}
遗憾的是它抛出:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 12
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:47)
at java.base/java.lang.String.charAt(String.java:693)
at Main.generateFromSentence(Main.java:9)
at Main.main(Main.java:3)
我不明白为什么索引会超出范围,在
String output = String.valueOf(sentence.charAt(0));
我指定索引 0 - 应该是我的字符串的第一个字符,对吗?
已经谢谢了。
您的问题不在行 String.valueOf(sentence.charAt(0));
中,而是在行 if (sentence.charAt(i) == ' ')
中。原因是您的 for 循环停止条件。您必须使用 i < sentence.length()
而不是 i <= sentence.length()
,如下所示:
public class Main {
public static void main (String[] args) {
System.out.println(generateFromSentence("Hello World!"));
}
public static String generateFromSentence(String sentence) {
String output = String.valueOf(sentence.charAt(0));
for (int i = 0; i <= sentence.length(); i++) {
if (sentence.charAt(i) == ' '){
String following = String.valueOf(sentence.charAt(i+1));
output = output.concat(following);
}
}
return output;
}
}
请记住,索引从 0 开始,因此您不能遍历从 0 开始直到并包括列表或数组大小的列表或数组。
此外,请记住,出于同样的原因,如果句子是 "Hello World! "
(请注意句子末尾的
),您(和我)上面的代码也会失败。原因是行String following = String.valueOf(sentence.charAt(i+1));
。要解决此问题,您需要在 if 语句中添加一个条件:
public class Main {
public static void main (String[] args) {
System.out.println(generateFromSentence("Hello World! "));
}
public static String generateFromSentence(String sentence) {
String output = String.valueOf(sentence.charAt(0));
for (int i = 0; i < sentence.length(); i++) {
if (sentence.charAt(i) == ' ' && ((i + 1) < sentence.length())){
String following = String.valueOf(sentence.charAt(i+1));
output = output.concat(following);
}
}
return output;
}
}
下面的代码应该给我一个由句子中 space 之后的所有字符连接而成的字符串:
public class Main {
public static void main (String[] args) {
System.out.println(generateFromSentence("Hello World!"));
}
public static String generateFromSentence(String sentence) {
String output = String.valueOf(sentence.charAt(0));
for (int i = 0; i <= sentence.length(); i++) {
if (sentence.charAt(i) == ' '){
String following = String.valueOf(sentence.charAt(i+1));
output = output.concat(following);
}
}
return output;
}
}
遗憾的是它抛出:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 12
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:47)
at java.base/java.lang.String.charAt(String.java:693)
at Main.generateFromSentence(Main.java:9)
at Main.main(Main.java:3)
我不明白为什么索引会超出范围,在
String output = String.valueOf(sentence.charAt(0));
我指定索引 0 - 应该是我的字符串的第一个字符,对吗?
已经谢谢了。
您的问题不在行 String.valueOf(sentence.charAt(0));
中,而是在行 if (sentence.charAt(i) == ' ')
中。原因是您的 for 循环停止条件。您必须使用 i < sentence.length()
而不是 i <= sentence.length()
,如下所示:
public class Main {
public static void main (String[] args) {
System.out.println(generateFromSentence("Hello World!"));
}
public static String generateFromSentence(String sentence) {
String output = String.valueOf(sentence.charAt(0));
for (int i = 0; i <= sentence.length(); i++) {
if (sentence.charAt(i) == ' '){
String following = String.valueOf(sentence.charAt(i+1));
output = output.concat(following);
}
}
return output;
}
}
请记住,索引从 0 开始,因此您不能遍历从 0 开始直到并包括列表或数组大小的列表或数组。
此外,请记住,出于同样的原因,如果句子是 "Hello World! "
(请注意句子末尾的
),您(和我)上面的代码也会失败。原因是行String following = String.valueOf(sentence.charAt(i+1));
。要解决此问题,您需要在 if 语句中添加一个条件:
public class Main {
public static void main (String[] args) {
System.out.println(generateFromSentence("Hello World! "));
}
public static String generateFromSentence(String sentence) {
String output = String.valueOf(sentence.charAt(0));
for (int i = 0; i < sentence.length(); i++) {
if (sentence.charAt(i) == ' ' && ((i + 1) < sentence.length())){
String following = String.valueOf(sentence.charAt(i+1));
output = output.concat(following);
}
}
return output;
}
}