Android IndexOutOfBound异常:位置无效0,大小为0

时间:2013-03-18 08:19:15

标签: java android

我遇到困难,运行GameView类时出错。它编译时没有错误,但在android仿真上运行它时会崩溃。我将在代码后发布logcat。

代码

    public class GameView extends View {

private Context myContext;
private List<Card> deck = new ArrayList<Card>();
private int scaledCardW;
private int scaledCardH;
private int screenW;
private int screenH;
private List<Card> myHand = new ArrayList<Card>();
private List<Card> oppHand = new ArrayList<Card>();
private List<Card> discardPile = new ArrayList<Card>();
private float scale;
private Paint whitePaint;
private int oppScore;
private int myScore;

public GameView(Context context) {
    super(context);
    myContext = context;
    scale = myContext.getResources().getDisplayMetrics().density;

    whitePaint = new Paint();
    whitePaint.setAntiAlias(true);
    whitePaint.setColor(Color.WHITE);
    whitePaint.setStyle(Paint.Style.STROKE);
    whitePaint.setTextAlign(Paint.Align.LEFT);
    whitePaint.setTextSize(scale * 15);

}

private void initCards() {
    for (int i = 0; i < 4; i++) {
        for (int j = 102; j < 115; j++) {
            int tempID = j + (i * 100);
            Card tempCard = new Card(tempID);
            int resourceID = getResources().getIdentifier("card" + tempID,
                    "drawable", myContext.getPackageName());
            Bitmap tempBitmap = BitmapFactory.decodeResource(
                    myContext.getResources(), resourceID);
            scaledCardW = (int) (screenW / 8);
            scaledCardH = (int) (scaledCardW * 1.28);
            Bitmap scaledBitmap = Bitmap.createScaledBitmap(tempBitmap,
                    scaledCardW, scaledCardH, false);
            tempCard.setBitmap(scaledBitmap);

            deck.add(tempCard);
        }
    }
}

private void drawCard(List<Card> handToDraw) {
    handToDraw.add(0, deck.get(0));
    deck.remove(0);

    if (deck.isEmpty()) {
        for (int i = discardPile.size() - 1; i > 0; i--) {
            deck.add(discardPile.get(i));
            discardPile.remove(i);
            Collections.shuffle(deck, new Random());

        }
    }
}

private void dealCards() {
    Collections.shuffle(deck, new Random());
    for (int i = 0; i < 7; i++) {
        drawCard(myHand);
        drawCard(oppHand);
    }
}

@Override
public void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    dealCards();

}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawText("Computer Score: " + Integer.toString(oppScore), 10,
            whitePaint.getTextSize() + 10, whitePaint);
    canvas.drawText("My Score: " + Integer.toString(myScore), 10, screenH
            - whitePaint.getTextSize() - 10, whitePaint);
}

    }

Logcat导出。

    03-18 07:51:46.795: W/dalvikvm(4395): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
    03-18 07:51:46.795: E/AndroidRuntime(4395): Uncaught handler: thread main exiting due to uncaught exception
    03-18 07:51:46.805: E/AndroidRuntime(4395): java.lang.IndexOutOfBoundsException: Invalid location 0, size is 0
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at java.util.ArrayList.get(ArrayList.java:341)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at com.agpfd.crazyeights.GameView.drawCard(GameView.java:66)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at com.agpfd.crazyeights.GameView.dealCards(GameView.java:81)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at com.agpfd.crazyeights.GameView.onSizeChanged(GameView.java:89)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at android.view.View.setFrame(View.java:6897)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at android.view.View.layout(View.java:6824)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at android.view.View.layout(View.java:6830)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at android.view.View.layout(View.java:6830)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at android.view.ViewRoot.performTraversals(ViewRoot.java:996)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at android.os.Handler.dispatchMessage(Handler.java:99)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at android.os.Looper.loop(Looper.java:123)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at android.app.ActivityThread.main(ActivityThread.java:4363)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at java.lang.reflect.Method.invokeNative(Native Method)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at java.lang.reflect.Method.invoke(Method.java:521)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    03-18 07:51:46.805: E/AndroidRuntime(4395):     at dalvik.system.NativeStart.main(Native Method)

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

initCards()永远不会在任何地方被调用,因此套牌列表为空,因此在handToDraw.add(0, deck.get(0))中调用drawCard()会导致您拥有的例外情况,并明确指出问题:您是尝试访问大小为0的列表的索引0处的元素:

Invalid location 0, size is 0

答案 1 :(得分:1)

你打电话

handToDraw.add(0, deck.get(0));

如果deck为空,则不进行检查。在下一行中

deck.remove(0);

删除一张卡,最终变空。

答案 2 :(得分:0)

这是一个IndexOutOfBoundsException。当数组列表大小已经为0时,您正在尝试获取第0个元素,即它是空的。检查并调试您的代码。