gpt4 book ai didi

java - java 和 .length 上的数组边界

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:46:31 25 4
gpt4 key购买 nike

键数组定义如下:

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

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

现在,此代码引发“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

有什么想法吗?

最佳答案

我可以在 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;
}

关于java - java 和 .length 上的数组边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19808486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com