【发布时间】: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?
-
它开始致命的人:(