0

行き詰まり、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);
}

    }

ログキャットのエクスポート。

    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)

どんな助けでも大歓迎です。

4

3 に答える 3

3

initCards()はどこにも呼び出されないため、デッキ リストは空であるため、呼び出すhandToDraw.add(0, deck.get(0))drawCard()例外が発生し、問題が明確に示されます。サイズ 0 のリストのインデックス 0 にある要素にアクセスしようとしています。

Invalid location 0, size is 0
于 2013-03-18T08:23:40.227 に答える
1

あなたが呼ぶ

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

deckが空かどうかをチェックせずに。次の行では、

deck.remove(0);

カードを1枚取り除くので、最終的には空になります。

于 2013-03-18T08:25:02.447 に答える
0

これは IndexOutOfBoundsException です。配列リストのサイズがすでに 0、つまり空であるときに、0 番目の要素を取得しようとしています。コードをチェックしてデバッグします。

于 2013-03-18T08:24:12.440 に答える