【问题标题】:Java String.charAt() throws java.lang.StringIndexOutOfBoundsExceptionJava String.charAt() 抛出 java.lang.StringIndexOutOfBoundsException
【发布时间】:2022-01-01 12:44:18
【问题描述】:

以下代码应该给我一个字符串,该字符串由句子中空格后的所有字符连接而成:

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 - 应该是我的字符串的第一个字符,对吗? 已经谢谢了。

【问题讨论】:

    标签: java string error-handling concatenation


    【解决方案1】:

    您的问题不在String.valueOf(sentence.charAt(0)); 中,而是在if (sentence.charAt(i) == ' ') 中。原因是你的 for 循环停止条件。您必须使用i &lt; sentence.length() 而不是i &lt;= 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;
        }
    }
    

    【讨论】:

    • 第一个代码括号里也应该是i
    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2012-09-01
    • 1970-01-01
    • 2014-03-23
    相关资源
    最近更新 更多