2016-02-17 1 views
1

Я производить карточную игру и один из моих методов палубных выглядеть следующим образомполучает индекс вне границ, когда массив не пуст

public Cards getCardFromDeck() { 

    if (arrayOfCards.get(0) == null) { 
     makeDeck(); 
     shuffleDeck(); 
    } 

    Cards topOfTheDeck = arrayOfCards.get(0); 
    arrayOfCards.remove(0); 


    return topOfTheDeck; 
} 

arrayOfCards связанный список, который я заполнил 52 карт.

Теперь проблема заключается в том, что это работает отлично, когда я вызываю getCardFromDeck в основном методе.

Но когда я пытаюсь получить доступ к нему через другой класс который я метод, похожий ниже

public void addToHand() { 
    hand.add(deck.getCardFromDeck()); 
} 

я получаю исключение в потоке «основного»

java.lang.IndexOutOfBoundsException: Индекс: 0, Размер: 0

, который, я думаю, говорит, что массив пуст.

Почему это ???

массив заполняется, когда доступ к нему из класса палубной который где этот метод, но не тогда, когда я достигаю от класса игрока

ниже вся моя колода класс

package com.jc.blackjack; 

import java.util.Collections; 
import java.util.LinkedList; 
import java.util.List; 

public class Deck { 

    private List<Cards> arrayOfCards = new LinkedList<>(); 

    public void makeDeck() { 

     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < 13; j++) { 
       Cards card = new Cards(i, j); 
       arrayOfCards.add(card); 
      } 
     } 
    } 

    public void callDeck() { 
     for (Cards arbCards : arrayOfCards) { 
      System.out.println(arbCards); 
     } 
    } 

    public void shuffleDeck() { 
     Collections.shuffle(arrayOfCards); 
    }  

    public Cards getCardFromDeck() { 

     if (arrayOfCards.get(0) == null) { 
      makeDeck(); 
      shuffleDeck(); 
     } 

     Cards topOfTheDeck = arrayOfCards.get(0); 
     arrayOfCards.remove(0); 


     return topOfTheDeck; 
    } 

} 
+1

Опубликовать стек trace и весь код, относящийся к 'deck' – Dave

ответ

1

Вы проверяете, если связанный список пуст, попросив 1-й элемент, вызвав get(0) и проверив для null. Это вызовет исключение IndexOfOutBoundsException.

Если вы хотите сказать, если связанный список не имеет карты, вы можете задать его для своего размера:

if(arrayOfCards.size() == 0) 

... или вы можете позвонить isEmpty():

if(arrayOfCards.isEmpty()) 
+0

, но я все равно должен был бы вызвать 0 экземпляр массива, перейдя arrayOfCards.get (0); правильно? – forJ

+0

или я это неправильно понял – forJ

+1

Нет, 'get (0)' попытается прочитать 1-й элемент. В пустом списке нет элементов, поэтому исключение будет выбрано. Помните, что большая часть Java использует индексирование с нулевым индексом. – Jason

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