我想得到一个像这样的字符串“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)
答案 0 :(得分:-1)
它出现在这一行:
s2
抛出: 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条件,该条件更具可读性和优雅性。