【问题标题】:ArrayIndexOutOfBounds even though it's not out of bounds [closed]ArrayIndexOutOfBounds 即使它没有超出范围[关闭]
【发布时间】:2014-07-31 04:15:37
【问题描述】:

我设置了int[] ledPositionControl = new int[33]。但它仍然说,我已经超出了界限。我做了一个 println,它只显示了 32 个,这在我看来是正确的。

谁能帮我解决这个问题?

Logcat

07-31 12:10:32.421: E/AndroidRuntime(22858): FATAL EXCEPTION: main
07-31 12:10:32.421: E/AndroidRuntime(22858): java.lang.ArrayIndexOutOfBoundsException: length=33; index=33
07-31 12:10:32.421: E/AndroidRuntime(22858):    at com.example.dotmatrixleddisplay.MySurfaceView.buttonPositionControl(MySurfaceView.java:100)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at com.example.dotmatrixleddisplay.MySurfaceView.surfaceChanged(MySurfaceView.java:74)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.view.SurfaceView.updateWindow(SurfaceView.java:623)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.view.SurfaceView.access$000(SurfaceView.java:86)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:178)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:703)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1942)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1108)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4491)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:755)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.view.Choreographer.doCallbacks(Choreographer.java:585)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.view.Choreographer.doFrame(Choreographer.java:555)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:741)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.os.Handler.handleCallback(Handler.java:615)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.os.Looper.loop(Looper.java:137)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at android.app.ActivityThread.main(ActivityThread.java:4949)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at java.lang.reflect.Method.invokeNative(Native Method)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at java.lang.reflect.Method.invoke(Method.java:511)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1043)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810)
07-31 12:10:32.421: E/AndroidRuntime(22858):    at dalvik.system.NativeStart.main(Native Method)

buttonPositionControl 方法

int offset;
int ledSizeControl;

int[] ledPositionControl = new int[33];
int ledBmpSize;
int positionControlSize;
final int  MAX_CONTROL=64;

private void buttonPositionControl() {
        //button position + led position
        int dpi;

        dpi=GraphicsMode.dpi;

        if(maxWidth<=maxHeight){//port
            if(maxWidth/dpi<2.6){
                ledSizeControl=0;
            }
            else if(maxWidth/dpi<3.25){
                ledSizeControl=4;
            }
            else{
                ledSizeControl=8;
            }

            ledBmpSize = ledBmp[0+ledSizeControl].getWidth(); 
            positionControlSize = ledBmpSize<<2;

            for(int i=0;i<=MAX_CONTROL;i++){
                ledPositionControl[i] = maxWidth/2+(i-MAX_CONTROL/2)*ledBmpSize;
                System.out.println("LEDPOSITION = "+i);
            }
            buttonPositionY = resetPositionY = 
                    ledPositionControl[MAX_CONTROL]+positionControlSize;
            buttonPositionX = ledPositionControl[2];
            resetPositionX = buttonPositionX+positionControlSize*5;


        }   
        else{//if(maxWidth<=maxHeight){land
            if(maxHeight/dpi<2.6){
                ledSizeControl=0;
            }
            else if(maxHeight/dpi<3.25){
                ledSizeControl=4;
            }           
            else{
                ledSizeControl=8;
            }

            ledBmpSize = ledBmp[0+ledSizeControl].getWidth(); 
            positionControlSize = ledBmpSize<<2;

            for(int i=0;i<=MAX_CONTROL;i++){
                ledPositionControl[i] = maxHeight/2+(i-MAX_CONTROL/2)*ledBmpSize;
            }
            buttonPositionX = resetPositionX = 
                    ledPositionControl[MAX_CONTROL]+positionControlSize;    
            buttonPositionY  =ledPositionControl[2];
            resetPositionY = buttonPositionY+positionControlSize*5;


        }//if else
        System.out.println("ledSizeControl:"+ledSizeControl);
        System.out.println("ledBmpSize"+ledBmpSize+" maxWidth/dpi"+maxWidth/dpi);
    }

【问题讨论】:

  • 您可以访问的最大索引是数组大小 - 1。
  • 第 100 行是哪一行?
  • 您最多只能看到“LEDPOSITION = 32”,因为它会在您调用 println 之前失败并导致线路崩溃
  • 当你的数组只有 33 个元素时,为什么 MAX_CONTROL 设置为 64?
  • 它开始致命的人:(

标签: java android


【解决方案1】:

首先,您的循环应该在i = 数组长度之前结束。

for(int i=0;i<ledPositionControl.length;i++){
    ledPositionControl[i] = maxWidth/2+(i-MAX_CONTROL/2)*ledBmpSize;
    System.out.println("LEDPOSITION = "+i);
}

第二,循环后的那一行应该是:

buttonPositionY = resetPositionY = ledPositionControl[ledPositionControl.length - 1]+positionControlSize;

并且不要忘记这些问题在您的代码中出现了两次。

【讨论】:

  • 确实按照您的步骤操作,但仍然崩溃并给了我同样的错误。我还编辑了我的主要帖子。其中有一些变量我忘记在帖子中添加。
  • 这是因为 MAX_CONTROL 大于数组的大小。要解决此问题,请设置MAX_CONTROL = 33 或使用ledPositionControl.length 而不是MAX_CONTROL
  • 编辑答案以使用ledPositionControl.length 而不是MAX_CONTROL(尽管您也可以设置MAX_CONTROL = 33)。
  • 啊好吧。现在我懂了。那么,改变 MAX_CONTROL 或 ledPositionControl 会起作用吗? MAX_CONTROL 小于 ledPositionControl 的大小或 ledPositionControl 数组大小大于 MAX_CONTROL ?
  • 一种常见的方式是:final int MAX_CONTROL=33; int[] ledPositionControl = new int[MAX_CONTROL]; 这样您只需更改 MAX_CONTROL 的值,数组大小也会随之变化。
【解决方案2】:

试试这个

改变这个

for(int i=0;i<=MAX_CONTROL;i++)

for(int i=0;i<MAX_CONTROL;i++)

for(int i=1;i<=MAX_CONTROL;i++)
    ledPositionControl[i - 1] = //your's

因为 MAX_CONTROL 值是 33 如果你以 0 开始 i 我应该以 0 到 32 结束

【讨论】:

  • 您的“或”选项不起作用,因为它仍会尝试访问数组的第 33 号元素。
  • 最后一个选项应该会消失。
  • 编辑纠正了这个问题(谢谢),但我仍然认为最后一个选项的整个想法非常奇怪。
  • 循环后 OPs 代码仍有错误 - 请参阅我的答案。
  • @Takendarkk 我没有告诉他只这样做。我得到的只是建议。
【解决方案3】:

试试这个,如果它不让我知道,它肯定会对你有所帮助

 Set MAX_CoNTROL = ledPositionControl.size();

 for(int i=0;i<MAX_CONTROL;i++){
            ledPositionControl[i] = maxHeight/2+(i-MAX_CONTROL/2)*ledBmpSize;
        }

并 Remove = 登录 for 循环,这使您的循环转到索引,因为您知道数组从 0 索引开始,因此最后一个索引将是 32 而不是 33 在日志案例中 33 是​​指总元素计数数组。

【讨论】:

  • 循环后的那一行也有错误——看我的回答。
【解决方案4】:

你迭代的次数太多了。将 for 循环中的

        for(int i=0;i<MAX_CONTROL;i++){
            ledPositionControl[i] = maxWidth/2+(i-MAX_CONTROL/2)*ledBmpSize;
            System.out.println("LEDPOSITION = "+i);
        }
        buttonPositionY = resetPositionY = 
                ledPositionControl[MAX_CONTROL-1]+positionControlSize;
        buttonPositionX = ledPositionControl[2];
        resetPositionX = buttonPositionX+positionControlSize*5;

我认为关键是您需要了解在分配有 32 个项目的数组中,您无法访问数组 [32]。数组的最后一个元素是 array[31],因为数组是从零开始的,这意味着它们从 0 开始,直到最大索引为 ARRAY_SIZE-1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多