java - Android IndexOutOfBound 异常 : Invalid location 0, 大小为 0

标签 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)

任何帮助将不胜感激。

最佳答案

initCards() 从未在任何地方被调用,因此牌组列表为空,因此在 中调用 handToDraw.add(0, Deck.get(0)) >drawCard() 会导致出现异常,这清楚地表明了问题:您正在尝试访问大小为 0 的列表的索引 0 处的元素:

Invalid location 0, size is 0

关于java - Android IndexOutOfBound 异常 : Invalid location 0, 大小为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15472304/

相关文章:

java - JSONParser 类型的方法 parse(FileReader) 未定义

java - DataOutputStream#writeBytes(String) 与 BufferedWriter#write(String)

java - 在Android自定义组件上添加setOnClickListener

android - RecyclerView with nested RecyclerView - 使嵌套的 RecyclerView 作为一个整体 View 可点击

android - Odex 文件与 dex 文件

java - Java中 "asynchronous method"是什么意思?

java - 将 Java 类转换为 vector - Clojure

maven - 如何通过maven拉取rt.jar?

android - 在 Android 上,我如何将文本包装在贝塞尔曲线路径中

android - 当 Android 应用程序仅以 alpha 版发布时,有没有办法将其链接到 Admob?