有些事情对我来说意义不大。为什么这样做:

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/

10-12 05:18