字符串超出范围 - java

时间:2016-02-22 09:20:30

标签: java

我想得到一个像这样的字符串“S s jA a sdL l swA a sdM ” 并打印像这样的“萨拉姆”字符串 (将字符打印为大写字母旁边的字符串)

我写了这个:

    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)

1 个答案:

答案 0 :(得分:-1)

它出现在这一行:

s2

根据documentation

  

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

由于您的k字符串为空(其长度为0),因此当您尝试添加时,超出界限。

此外,由于您的setChatAt变量始终在StringBuilder方法之前初始化为零,并且它仅在if语句块中定义,因此您将始终设置为索引0,甚至如果可以的话。

我建议您只是尝试使用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); 代替,并丢弃杂乱的字母循环 - 它们的ASCII代码是顺序的,您可以简单地询问字符是否在范围内:

Character.isUpperCase(c)

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

请注意,您也可以使用right替换if条件,该条件更具可读性和优雅性。