hupdy
hupdy

Reputation: 3

Android IndexOutOfBound Exception : Invalid location 0, size is 0

I am stuck and I get an error when running the GameView class. It compiles with no error but when running it on android emulation it crashes. I will post the logcat after the code.

Code

    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 export.

    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)

Any help will be appreciated.

Upvotes: 0

Views: 221

Answers (3)

Olaf Dietsche
Olaf Dietsche

Reputation: 74078

You call

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

without checking, if deck is empty or not. In the next line you

deck.remove(0);

remove one card, so it becomes empty eventually.

Upvotes: 1

Kumar Bibek
Kumar Bibek

Reputation: 9117

It's an IndexOutOfBoundsException. You are trying to get the zeroth element, when the array list size is already 0, ie, it's empty. Check and debug your code.

Upvotes: 0

JB Nizet
JB Nizet

Reputation: 691953

initCards() is never called anywhere, so the deck list is empty, so calling handToDraw.add(0, deck.get(0)) in drawCard() leads to the exception you have, and which clearly indicates the problem: you're trying to access the element at index 0 of a list of size 0:

Invalid location 0, size is 0

Upvotes: 3

Related Questions