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;
    }
}