【发布时间】:2018-06-14 05:03:36
【问题描述】:
嘿,我不知道为什么,但是这个循环不起作用,每次都给我同样的错误。如果您知道修复方法,请回答。而且我无法解决这个问题。
这是我的循环
double angle = 0;
for (int i = 0; i < 120; i++, angle += 3) {
int x = (int) Math.ceil(i * 8.5);
int t = ((byte) (-Math.abs(bytes[x]) + 128))
* (canvas.getHeight() / 4) / 128;
points[i * 4] = (float) (getWidth() / 2
+ radius
* Math.cos(Math.toRadians(angle)));
points[i * 4 + 1] = (float) (getHeight() / 2
+ radius
* Math.sin(Math.toRadians(angle)));
points[i * 4 + 2] = (float) (getWidth() / 2
+ (radius + t)
* Math.cos(Math.toRadians(angle)));
points[i * 4 + 3] = (float) (getHeight() / 2
+ (radius + t)
* Math.sin(Math.toRadians(angle)));
}
这是我的错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: app.androidgrid.faysr, PID: 19297
java.lang.ArrayIndexOutOfBoundsException: length=128; index=128
at app.androidgrid.faysr.visualizer.view.CircleBarVisualizer.onDraw(CircleBarVisualizer.java:94)
at android.view.View.draw(View.java:17096)
at android.view.View.updateDisplayListIfDirty(View.java:16078)
我也尝试将 120 更改为 128 并将 i 更改为 i 但事实并非如此
这是我的 java 类
public class CircleBarVisualizer extends BaseVisualizer {
private float[] points;
private Paint circlePaint;
private int radius;
public CircleBarVisualizer(Context context) {
super(context);
}
public CircleBarVisualizer(Context context,
@Nullable AttributeSet attrs) {
super(context, attrs);
}
public CircleBarVisualizer(Context context,
@Nullable AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void init() {
paint.setStyle(Paint.Style.STROKE);
circlePaint = new Paint();
radius = -1;
}
@Override
protected void onDraw(Canvas canvas) {
if (radius == -1) {
radius = getHeight() < getWidth() ? getHeight() : getWidth();
radius = (int) (radius * 0.65 / 2);
double circumference = 2 * Math.PI * radius;
paint.setStrokeWidth((float) (circumference / 120));
circlePaint.setStyle(Paint.Style.STROKE);
circlePaint.setStrokeWidth(4);
}
circlePaint.setColor(color);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, circlePaint);
if (bytes != null) {
if (points == null || points.length < bytes.length * 4) {
points = new float[bytes.length * 4];
}
double angle = 0;
try {
for (int i = 0; i < 120; i++, angle += 3) {
int x = (int) Math.ceil(i * 8.5);
int t = ((byte) (-Math.abs(bytes[x]) + 128))
* (canvas.getHeight() / 4) / 128;
points[i * 4] = (float) (getWidth() / 2
+ radius
* Math.cos(Math.toRadians(angle)));
points[i * 4 + 1] = (float) (getHeight() / 2
+ radius
* Math.sin(Math.toRadians(angle)));
points[i * 4 + 2] = (float) (getWidth() / 2
+ (radius + t)
* Math.cos(Math.toRadians(angle)));
points[i * 4 + 3] = (float) (getHeight() / 2
+ (radius + t)
* Math.sin(Math.toRadians(angle)));
}
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
canvas.drawLines(points, paint);
}
super.onDraw(canvas);
}}
我也是try-catch所以,它不会让应用崩溃,但结果不是我例外。
【问题讨论】:
-
for 循环将 i 从 0 迭代到 119,但随后代码使用 i 的倍数 (
i * 4...) 来寻址只有 128 个元素长的points数组中的元素(例外说)。 -
您正在访问两个数组:
points[]和bytes[]。后者由x索引,即ceil(i * 8.5)。对于i == 15,x的值将是 128 (ceil(127.5)),并且也适合您的错误消息。因此,这也可能是一个问题。 -
您的一个数组的长度为 128,因此您的最大索引为 127,因为您的索引为零。您的循环似乎导致您尝试访问大于数组大小的元素。尝试注释掉每个数组元素调用,看看哪个触发了错误。当
i=15时,您的Math.ceil(i * 8.5)呼叫将达到128 -
@AnkitSuda 确保您投票并接受答案。
标签: java android arrays for-loop indexoutofboundsexception