2013-03-18 2 views
0

Я застреваю, и я получаю сообщение об ошибке при запуске класса GameView. Он компилируется без ошибок, но при запуске на эмуляции Android он сработает. После отправки кода я вывешу logcat.Android IndexOutOfBound Исключение: неверное местоположение 0, размер 0

Код

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) 

Любая помощь будет оценена по достоинству.

+0

что находится в строке 66 в 'GameView.java'? –

ответ

3

initCards() никогда не вызывается в любом месте, так что список колода пуста, поэтому вызов handToDraw.add(0, deck.get(0)) в drawCard() приводит к исключению у вас есть, и что явно указывает на проблему: вы пытаетесь получить доступ к элементу с индексом 0 из списка от 0:

Invalid location 0, size is 0 
+0

Спасибо всем за помощь, я добавил initCards() в onSizeChange и добавил несколько других переменных, и это сработало. Еще раз спасибо. – hupdy

0

Это исключение IndexOutOfBoundsException. Вы пытаетесь получить нулевой элемент, когда размер списка массива уже равен 0, т. Е. Он пуст. Проверьте и отлаживайте свой код.

1

Вы называете

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

без проверки, если deck пуст или нет. На следующей строке вы:

deck.remove(0); 

удалите одну карту, чтобы она в конечном итоге стала пустой.

Смежные вопросы