5

键数组已定义如下:

    keys = new char[] {resolv, 'А', 'Б', 'В', 'Г', 'Д', 'Е', 
                                'Ё', 'Ж', 'З', 'И', 'Й', 'К', 
                                'Л', 'М', 'Н', 'О', 'П', 'Р', 
                                'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 
                                'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь',
                                'Э', 'Ю', 'Я'};

'resolv' 是 0x00 的常量 char 值,但这与此问题无关。

现在,此代码有时会引发“java.lang.ArrayIndexOutOfBoundsException: length=34; index=34”异常:

protected void LoadKeyRects() {
    keyRects = new Rect[keys.length];
    // Solve key
    keyRects[0] = resRect;


    // Rest of keys
    int x, y;
    for (int i=1; i<keys.length; i++) {
        y = 214 + ( 87 * ((i-1)/11));
        x = 7 + (((i-1)%11)*71);
        keyRects[i] = new Rect (x, y, x+71, y+87);
    }
}

到目前为止,我自己无法重现该错误,但我已经从第三方设备中的 BugSense 获得了足够的报告来关注它。似乎有时 keyRects[i] 可能指的是 keyRects[keys.length] 尽管 i

有任何想法吗?

4

1 回答 1

4

for我可以在循环中看到问题。您使用超出范围的字段来结束迭代,如果您不访问该字段本身,这是完全错误的。另外,如果您这样做了,则应该以不同的方式进行。两个例子:

protected void LoadKeyRects() {
    keyRects = new Rect[keys.length];
    // Solve key
    keyRects[0] = resRect;


    // Rest of keys
    int x, y;
    for (int i=1; i<keyRects.length; i++) {
        y = 214 + ( 87 * ((i-1)/11));
        x = 7 + (((i-1)%11)*71);
        keyRects[i] = new Rect (x, y, x+71, y+87);
    }
}

这将在没有任何ArrayIndexOutOfBoundsException确定的情况下正常工作。如果您需要访问甚至修改keys数组,请这样做:

protected void LoadKeyRects() {
    final char[] localKeys = keys;

    keyRects = new Rect[localKeys.length];
    // Solve key
    keyRects[0] = resRect;


    // Rest of keys
    int x, y;
    for (int i=1; i<localKeys.length; i++) {
        y = 214 + ( 87 * ((i-1)/11));
        x = 7 + (((i-1)%11)*71);
        keyRects[i] = new Rect (x, y, x+71, y+87);
    }

    // if you need to change the keys, uncomment the next line
    // keys = localKeys;
}
于 2013-11-06T10:44:17.843 回答