java - How to store custom objects in an ArrayList -
this question has answer here:
- what nullpointerexception, , how fix it? 12 answers
i'm making game cards, characters cards.
i first create cards chosen user, add them list, shuffle , display 'em 1 one, players name (chosen in previous activity user).
the fact is, when try card class list, , invoking methods getplayer() & getcharacter (which return player's name , characters' name of specific card) nullpointer exception.
java.lang.nullpointerexception: attempt invoke virtual method 'java.lang.string com.example.leonardo.lupusintabula.characters.card.getcharacter()' on null object reference randombutton.settext(characters.get(0).getcharacter() + " / " + characters.get(0).getplayer()); the oncreate():
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_random_assignment); //retrieving ... //done retrieving initializevariables(); createcharacters(); run(); } as issue in characters, i'm listing code it's in:
// characters 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 non-negative number of characters " + card.getcharacter() ); } (int = 0; < amount; i++) { cards.add(card); } } //pick random 1 , display 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 characters initdeck(); // shuffle them collections.shuffle(characters); //display 1st card if(characters != null) { randombutton.settext(characters.get(0).getcharacter() + " / " + characters.get(0).getplayer()); } } private void initializevariables() { ... ... characters = new arraylist<card>(); } }
what doing wrong? if need other part of code feel free ask, i'll provide possible!
this may drive crazy it's way found achieve creation of characters (each character extends card class!):
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; }
from other answer, took code. initdeck method reads this
public void initdeck() { if (characters == null) characters = new arraylist<string>(); // addcharacter... that @ least avoid null pointer on list...
you need add more code question, problem starts in block
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); which (roughly) calls code
public void addcharacter(card card, int amount, list<card> cards) { (int = 0; < amount; i++) { cards.add(card); } } the issue somewhere of these variables null , being added list such
demoniacguardmediummythomaniacowlwerehamstergetvillagerbundle()masononemasontwo
you either fix assigning variables new card(), or avoid problem
public void addcharacter(card card, int amount, list<card> cards) { (int = 0; < amount; i++) { if (card != null) { cards.add(card); } else { log.e("addcharacter", "hey! sure meant add null card?"); } } } now have shown more of code, error starts here
if (demoniacamount != 0) { demoniac = new demoniac(namelist.get(listindex)); listindex++; } else if (guardamount != 0) { guard = new guard(namelist.get(listindex)); listindex++; } what if demoniacamount , guardamount both not zero, hmm? first if condition entered. , guard end being null because never initialized. makes no sense else-if different variables!
properly perform if-checking conditions. (and leave messy code as bothers me)
if (demoniacamount != 0) { demoniac = new demoniac(namelist.get(listindex)); listindex++; } if (guardamount != 0) { guard = new guard(namelist.get(listindex)); listindex++; }
Comments
Post a Comment