2016-02-06 3 views
-2

Я делаю игру с картами, картами символов.Как хранить пользовательские объекты в ArrayList

Сначала я создаю карточки, выбранные пользователем, затем добавляю их в List, перемешайте их, а затем отобразите их поодиночке с именем своих игроков (выбранным в предыдущем действии пользователя).

Дело в том, что когда я пытаюсь получить класс Карты из списка и вызывая его методы getPlayer() & getCharacter (который возвращает имя игрока и имя персонажа конкретной карты), я получаю nullPointer Исключение.

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.leonardo.lupusintabula.characters.Card.getCharacter()' on a null object reference 

randomButton.setText(characters.get(0).getCharacter() + "/" + characters.get(0).getPlayer()); 

OnCreate():

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_random_assignment); 

    //Retrieving 
     ... 
    //Done retrieving 
    initializeVariables(); 
    createCharacters(); 
    run(); 
} 

Поскольку этот вопрос, вероятно, в символах, я перечисляю вам весь код это в:

// Where the characters are stored 
private ArrayList<Card> characters; 


public void initDeck() { 
    addCharacter(demoniac, demoniacAmount, characters); 
    addCharacter(guard, guardAmount, characters); 
    addCharacter(medium, mediumAmount, characters); 
    addCharacter(mythomaniac, mythomaniacAmount, characters); 
    addCharacter(owl, owlAmount, characters); 
    addCharacter(werehamster, werehamsterAmount, characters); 
    addCharacter(getVillagerBundle(), villagerAmount, characters); 
    addCharacter(masonOne, 1, characters); 
    addCharacter(masonTwo, 1, characters); 
} 

public void addCharacter(Card card, int amount, List<Card> cards) { 
    if (amount < 0) { 
     throw new IllegalArgumentException("Must add a non-negative number of characters for " + card.getCharacter()); 
    } 

    for (int i = 0; i < amount; i++) { 
     cards.add(card); 
    } 
} 



//Pick a random one and display it 
public void pick(View view){ 
    if(characters != null) { 
     if (i < characters.size()) { 
      randomButton.setText(characters.get(i).getCharacter() + "/" + characters.get(i).getPlayer()); 
      i++; 
     } else { 
      randomButton.setText(R.string.play); 
     } 
    } 
} 

void run() { 
    // initialize the characters 
    initDeck(); 

    // shuffle them 
    Collections.shuffle(characters); 

    //Display the 1st card 
    if(characters != null) { 
     randomButton.setText(characters.get(0).getCharacter() + "/" + characters.get(0).getPlayer()); 
    } 
} 


private void initializeVariables() { 
    ... 
    ... 

    characters = new ArrayList<Card>(); 
} 

}

Что я делаю неправильно? Если вам нужна другая часть кода, не стесняйтесь спрашивать, я предоставлю ее вам как можно скорее!

Это может свести вас с ума, но это единственный способ, которым я нашел, чтобы добиться создания символов (каждый символ расширяет класс карты!):

public void createCharacters() { 
    if (demoniacAmount != 0) { 
     demoniac = new Demoniac(nameList.get(listIndex)); 
     listIndex++; 
    } else if (guardAmount != 0) { 
     guard = new Guard(nameList.get(listIndex)); 
     listIndex++; 
    } else if (mediumAmount != 0) { 
     medium = new Medium(nameList.get(listIndex)); 
     listIndex++; 
    } else if (mythomaniacAmount != 0) { 
     mythomaniac = new Mythomaniac(nameList.get(listIndex)); 
     listIndex++; 
    } else if (owlAmount != 0) { 
     owl = new Owl(nameList.get(listIndex)); 
     listIndex++; 
    } else if (werehamsterAmount != 0) { 
     werehamster = new Werehamster(nameList.get(listIndex)); 
     listIndex++; 
    } else if (masonsAmount != 0) { 
     masonOne = new Masons(nameList.get(listIndex)); 
     masonTwo = new Masons(nameList.get(listIndex)); 
     listIndex += masonsAmount; 
    } else if (villagerAmount > 5) { 
      villagerSix = new Villager(nameList.get(listIndex)); 
      villagerBundle.add(villagerSix); 

      if (villagerAmount > 6) { 
       villagerSeven = new Villager(nameList.get(listIndex)); 
       villagerBundle.add(villagerSeven); 

       if (villagerAmount > 7) { 
        villagerEight = new Villager(nameList.get(listIndex)); 
        villagerBundle.add(villagerEight); 

        if (villagerAmount > 8) { 
         villagerNine = new Villager(nameList.get(listIndex)); 
         villagerBundle.add(villagerNine); 

         if (villagerAmount > 9) { 
          villagerTen = new Villager(nameList.get(listIndex)); 
          villagerBundle.add(villagerTen); 

          if (villagerAmount > 10) { 
           villagerEleven = new Villager(nameList.get(listIndex)); 
           villagerBundle.add(villagerEleven); 

           if (villagerAmount > 11) { 
            villagerTwelve = new Villager(nameList.get(listIndex)); 
            villagerBundle.add(villagerTwelve); 

            Toast.makeText(RandomAssignment.this, "works", Toast.LENGTH_SHORT).show(); 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
     listIndex += villagerAmount; 
    } 
+0

Что делает метод getVillagerBundle()? Может ли он вернуть null? – Blue

+0

Коллекции позволяют добавлять нулевые значения. – Blackbelt

+0

'public Card getVillagerBundle() { int i = 0; do {return villagerBundle.get (i); } while (i FET

ответ

0

От моего other answer, из которого вы взяли мой код. Метод initDeck фактически читает как этот

public void initDeck() { 
    if (characters == null) 
     characters = new ArrayList<String>(); 

     // addCharacter... 

Это будет по крайней мере, избежать пустой указатель на список ...


Вам нужно добавить больше кода на ваш вопрос, но проблема начинается в этом блоке

addCharacter(demoniac, demoniacAmount, characters); 
addCharacter(guard, guardAmount, characters); 
addCharacter(medium, mediumAmount, characters); 
addCharacter(mythomaniac, mythomaniacAmount, characters); 
addCharacter(owl, owlAmount, characters); 
addCharacter(werehamster, werehamsterAmount, characters); 
addCharacter(getVillagerBundle(), villagerAmount, characters); 
addCharacter(masonOne, 1, characters); 
addCharacter(masonTwo, 1, characters); 

который (примерно) называет этот код

public void addCharacter(Card card, int amount, List<Card> cards) { 
    for (int i = 0; i < amount; i++) { 
     cards.add(card); 
    } 
} 

Вопрос заключается в том, что где-то ЛЮБЫЕ из этих переменных являются нулевыми, и они добавляются к списку как таковые

  • demoniac
  • guard
  • medium
  • mythomaniac
  • owl
  • werehamster
  • getVillagerBundle()
  • masonOne
  • masonTwo

Вы можете либо исправить, назначив все эти переменные в new Card() или избежать этой проблемы, как так

public void addCharacter(Card card, int amount, List<Card> cards) { 
    for (int i = 0; i < amount; i++) { 
     if (card != null) { 
      cards.add(card); 
     } else { 
      Log.e("addCharacter", "Hey! Are you sure you meant to add a null card?"); 
     } 
    } 
} 

Теперь то, что вы показали больше кода , здесь начинается ошибка

if (demoniacAmount != 0) { 
    demoniac = new Demoniac(nameList.get(listIndex)); 
    listIndex++; 
} else if (guardAmount != 0) { 
    guard = new Guard(nameList.get(listIndex)); 
    listIndex++; 
} 

Что делать, если demoniacAmount и guardAmount оба не равны нулю, хм? Только первое, если условие будет введено. И guard в конечном итоге будет null, потому что он никогда не был инициализирован. Нет смысла делать else-if для совершенно разных переменных!

Правильно выполните проверку, если это необходимо для всех этих условий. (И я оставлю грязный код столько, сколько это надоедает мне)

if (demoniacAmount != 0) { 
    demoniac = new Demoniac(nameList.get(listIndex)); 
    listIndex++; 
} 

if (guardAmount != 0) { 
    guard = new Guard(nameList.get(listIndex)); 
    listIndex++; 
} 
+0

Я нашел проблему с исходным кодом, поэтому я попытался изменить его (бесполезно) **, но ** возможно, благодаря этому ответу я понял, в чем проблема: я прошу параметр «Карта как параметр», в addCHaracter(), но я передаю все классы, которые расширяют класс Карты, но они не являются самими классами Карты. Может быть, проблема? – FET

+0

Если они расширяют Карту, это совершенно нормально. Ошибка очень ясна, что вы добавили нулевую карту –

+0

Я не могу понять, где, кстати, вы видели обновленный вопрос? – FET

1

В соответствии журналам: символов. get (0) дает null, и на нем вы пытаетесь вызвать getCharacter(), следовательно, исключение null-указателя.

Проверьте, где ваш размер символов достигает 0 или по ошибке вы назначаете его новому объекту.

Лучшим способом является применение проверки для if (characters.size()> 0), тогда вы получите только символы.

Вы не инициализировали переменные initializeVariables(); никогда не называется.

+0

, который вы не вызывали initializeVariables() –

+0

Если список был пустым, он не выбрал бы NullPointerException –

+0

, почему бы , Если вы пытаетесь получить доступ к элементу 0 из пустого списка. он даст вам null. и если вы попытаетесь вызвать какой-либо метод на этом, это даст исключение из null-указателя. Можете ли вы обновить свой код при вызове initializeVariables() –

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

  • Нет связанных вопросов^_^