有些事情对我来说意义不大。为什么这样做:
public static int[] countNumbers(String n){
int[] counts = new int[10];
for (int i = 0; i < n.length(); i++){
if (Character.isDigit(n.charAt(i)))
counts[n.charAt(i)]++;
}
return counts;
}
在此期间显示ArrayOutOfBounds错误:
public static int[] countNumbers(String n){
int[] counts = new int[10];
for (int i = 0; i < n.length(); i++){
if (Character.isDigit(n.charAt(i)))
counts[n.charAt(i) - '0']++;
}
return counts;
}
才不是?这两个示例之间的唯一区别是,在第二个示例中,计数索引被减零。如果我没记错的话,由于检查了相同的值,第一个示例是否应该正确显示?
这是为两种方法传递的值:
System.out.print("Enter a string: ");
String phone = input.nextLine();
//Array that invokes the count letter method
int[] letters = countLetters(phone.toLowerCase());
//Array that invokes the count number method
int[] numbers = countNumbers(phone);
最佳答案
这就是问题:
counts[n.charAt(i)]++;
n.charAt(i)
是一个字符,它将转换为整数。因此,例如“ 0”实际上是48 ...但是您的数组只有10个元素。请注意,工作版本不会减去0-它会减去“ 0”,或者在转换为
int
时会减去48。所以基本上:
Character UTF-16 code unit UTF-16 code unit - '0'
'0' 48 0
'1' 49 1
'2' 50 2
'3' 51 3
'4' 52 4
'5' 53 5
'6' 54 6
'7' 55 7
'8' 56 8
'9' 67 9
但是,对于非ASCII数字,该代码仍然无效。由于它只能处理ASCII数字,因此最好使它明确:
for (int i = 0; i < n.length(); i++){
char c = n.charAt(i);
if (c >= '0' && c <= '9') {
counts[c - '0']++;
}
}
关于java - 为什么这会导致ArrayIndexOutOfBoundsException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20569746/