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 から十分なレポートを得ており、心配する必要があります。i にもかかわらず、keyRects[i] が keyRects[keys.length] を参照する場合があるようです。

何か案は?

4

1 に答える 1

4

forループに問題があることがわかります。フィールド自体にアクセスしていない場合、スコープ外のフィールドを使用して反復を終了しますが、これは単に間違っています。また、そうした場合は、別の方法で行う必要があります。2 つの例:

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 に答える