java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:4

时间:2016-03-05 02:05:00

标签: java intellij-idea bluej

我一直在尝试编写一个Java程序,它将字符串中每个单词的第一个字母转换为大写字母。现在它看起来像这样:

package strings;
import java.util.Scanner;

public class small_cap {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the sentence");
        String st = sc.next();
        String str = " " + st;

        int j = 0; char chr = ' ';

        for (int i = 0; i < str.length(); i++){
            j = i + 1;
            chr = str.charAt(j);
            if (chr == ' '){
                char a = Character.toUpperCase(str.charAt(j));
                str = str.replace(str.charAt(j), a);
            }
            else{
                char a = Character.toLowerCase(str.charAt(j));
                str = str.replace(str.charAt(j), a);
            }
        }
        System.out.println(str);
    }
}

不幸的是我继续收到错误:

java.lang.StringIndexOutOfBoundsException: String index out of range: 4
    at java.lang.String.charAt(String.java:658)
    at small_cap.main(small_cap.java:19)

我真的没有看到代码中的任何错误。有人可以指出我哪里出错吗?

2 个答案:

答案 0 :(得分:0)

    for (int i = 0; i < str.length(); i++){
        j = i + 1;

i到达最后一个有效索引length - 1时,j将等于length,这超出了界限。

我真的没有看到j变量开头的意思 - 你是不是也想在循环中的其他地方使用i,或者你应该让你的循环从1?或者你是否意味着通过j = i - 1;检查前一个字符(在这种情况下确保你在索引0之前没有读过)

答案 1 :(得分:0)

  1. 您使用的是Scanner.next()而不是Scanner.nextLine(),它将读取整个句子,而不是单个单词。
  2. 您正在String中添加额外的空间。不知道背后的重要原因。没有它就可以完成。
  3. 假设输入为:“abc def”,在添加额外空格后将变为“abc def”。字符串的长度将变为:7
  4. 现在for循环将从0迭代到6.但是在i = 6时它会尝试改变第7个位置的元素(因为你正在做j = i + 1),这将导致字符串索引超出范围错误。 / LI>
  5. 您正在使用String.Replace,它将替换所有匹配的字符,无论其位置如何。

    import java.util.Scanner;

    public class small_cap {
        public static void main(String[] args) {
    
            Scanner sc = new Scanner(System.in);
            System.out.println("Enter the sentence");
            String st = sc.nextLine();
            String str = " " + st;
    
            int j = 0; char chr = ' ';
    
            for (int i = 0; i < str.length()-1; i++){
               j = i+1;
    
                chr = str.charAt(i);
                if (chr == ' '){
                    char a = Character.toUpperCase(str.charAt(j));
                    str = str.substring(0,j)+a+str.substring(j+1);
                }
                else{
                    char a = Character.toLowerCase(str.charAt(j));
                    str = str.substring(0,j)+a+str.substring(j+1);
                }
            }
            System.out.println(str);
        }
    

    }