public class demo {
public void countCharacter(char[] ch) {
String str=new String(ch);
int count = 0,len=0;
do {
char[] charToLoop = str.toCharArray();
len = charToLoop.length ;
count = 0;
for(int i=0;i < len;i++) {
if(charToLoop[0] == charToLoop[i]) {
count++;
}
}
if(count!=0) {
System.out.println(charToLoop[0] + " " + count);
}
str = str.replace(""+charToLoop[0], "");
} while (len != 0);
}
public static void main(String[] args) {
String s;
Scanner sc = new Scanner(System.in);
System.out.println("Enter your String");
s = sc.nextLine();
char[] ch = s.toCharArray();
demo l4 = new demo();
l4.countCharacter(ch);
}
}
输出:
<块引用>输入您的字符串
萨那
s 1
一个 2
n 1
线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException:索引 0 超出长度 0 的边界
不使用try/catch,如何解决这个异常?
答案 0 :(得分:0)
您可以通过在正确的时间重新计算字符串的长度来解决问题:
} while (str.length() > 0);
说明:
ArrayIndexOutOfBounds 是因为你进入循环的次数太多了;您要比较的“len”不再是 str.replace 将其至少减少 1 之后的字符串长度。
Putting while (len > 1 )
修复了输入 'sana' 的问题,但对于 'snaa' 仍然会失败,因为 str.replace 替换了第一个参数的所有出现;
所以两个'a'字符都被一次性删除,并且输入'snaa'在一次循环中将字符串的长度从2减少到0。
while 语句中的验证使用的是 'stale' 数据:在 str.replace 完成其工作后,'len' 不再保存字符串的长度;所以在做验证的时候再计算一下:while (str.length() > 0)
.
旁注:
do { ... } while()
比 while(){ ... }
难多了。在您的情况下:您的示例仍然会因空输入而失败(用户只需按 Enter)。但是 while(str.length() > 0) { ... }
会自动捕获它,因为它不允许第一次通过循环体。老实说,我认为 do-while 没有任何合理的用途。
当然这不是一个性能练习,但可以考虑只使用 char[] ch
参数,而不用创建一个字符串来实现相同的目标。 str = str.replace(...)
是一个非常繁重的解决方案。