我想得到一个这样的字符串 "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)
。