字符串超出范围 - java



我想得到一个这样的字符串 "SsjA a sdLlswAasdMm"并打印像这样的字符串"salam"(将字符打印为大写字母旁边的字符串)

我写了这个:

    import java.util.Scanner;
public class Temp {
    public static void main(String[] args) {
        char[] capitalalphabet = new char[]{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        Scanner input = new Scanner(System.in);
        String s1 = input.next();
        StringBuffer s2 = new StringBuffer();
        for (int i=0 ; i < s1.length() ; i++) {
            for (int j = 0; j < capitalalphabet.length; j++) {
                if (s1.charAt(i) == capitalalphabet[j]){
                    int k = 0 ;
                    s2.setCharAt(k , s1.charAt(i+1));
                    k++;
                }
            }
        }
        System.out.println(s2);

    }
}

我得到了这个错误:

    SAhfdsdEDsa
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.StringBuffer.setCharAt(StringBuffer.java:257)
    at Temp.main(Temp.java:14)

它发生在这一行:

 s2.setCharAt(k, s1.charAt(i+1));

根据文档:

抛出: StringIndexOutOfBoundsException - 如果 start 小于零或大于此对象的长度。

由于s2字符串为空(其长度为 0),因此当您尝试添加到它时,您超出了边界。

此外,由于您的 k 变量总是在 setChatAt 方法之前初始化为零,并且它仅在 if-语句块中定义,因此即使可以,您也将始终设置为索引 0。

我建议你简单地尝试使用StringBuilder,并丢弃大写字母的混乱循环 - 它们的ASCII代码是连续的,你可以简单地问字符是否在范围内:

for (int i=0 ; i < s1.length()-1; i++) {
    char c = s1.charAt(i);
    if (c >= 'A' && c <= 'Z') {
        s2.append(s1.charAt(i+1));
    }
}
System.out.println(s2);

请注意,循环扫描到最后一个索引,因为它可能会访问下一个索引(并且由于不需要检查最后一个字符 - 它后面不能跟任何内容,大写或其他)。

请注意,您还可以将 if 条件替换为更具可读性和优雅的 Character.isUpperCase(c)

最新更新