16. september 2003 - 17:03
Der er
31 kommentarer og 1 løsning
Random - nullpointexeption
Hej Jeg skal vælge en random i et array, men jeg får en nullPointerExeption! public Item chooseItem() { int itemsSize = items.size(); int index = randomGenerator.nextInt(itemsSize); return (Item) items.get(index); }
Annonceindlæg tema
16. september 2003 - 17:07
#1
Det er sikkert fordi at det index du refererer til ikke eksisterer... Post noget kode eller prøv dig frem med f.eks. System.out.println(...);
16. september 2003 - 17:07
#2
Der må kun være 2 muligheder for NullPointerException: enten er items null eller så er randomGenerator null.
16. september 2003 - 17:10
#3
Den er ikke kommmenteret, men måske kan I hjælpe alligevel? import java.util.*; public class Room { private List rooms; private Collection items; private String name; private Random randomGenerator; public Room(String name) { rooms = new ArrayList(4); for (int i = 0; i<4; i++) { rooms.add(i, null); } items = new ArrayList(); this.name = name; } public void connectTo(int dir, Room r) { rooms.set(dir, r); } public boolean roomExists(int dir) { return rooms.get(dir) != null; } public Room leadsTo(int dir) { return rooms.get(dir); } public void addItem(Item i) { items.add(i); } public boolean itemExists() { return items != null; } public Item chooseItem() { int itemsSize = items.size(); int index = randomGenerator.nextInt(itemsSize); return (Item) items.get(index); } public void removeItem(Item i) { items.remove(i); } }
16. september 2003 - 17:11
#4
repsak> Med den kode skal index eksistere da den jo er mindre end size (og den ville også give en IndexOutOfBoundsException hvis den ikke gjorde)
16. september 2003 - 17:11
#5
public Room(String name) { rooms = new ArrayList(4); for (int i = 0; i<4; i++) { rooms.add(i, null); } items = new ArrayList(); this.name = name; } dit element er null
16. september 2003 - 17:12
#6
randomGenerator er ikke initialiseret. private Random randomGenerator = new Random();
16. september 2003 - 17:14
#7
arne_v -> ja det har du nok ret i (bare en hurtig indskydelse :-)
16. september 2003 - 17:16
#8
okay, nu er min random generator initialisteret, men der er åbenbart en fejl, jeg ikke lige kan få øje på i linjen: return (Item) items.get(index); Den siger "cannot resolve symbol" ??
16. september 2003 - 17:19
#9
Hvilket symbol kan den ikke resolve ?
16. september 2003 - 17:20
#10
items er af typen Collection, som ikke indeholder en get. Brug istedet interfacet List
16. september 2003 - 17:21
#11
Hmm jeg har fikset det, jeg ændrede min Collection til en ArrayList...
16. september 2003 - 17:22
#12
Tak for hjælpen... Jeg kan nok godt bruge noget hjælp til at oprette en toString metode eller to, hvis der er nogen der har mod på det - er der point at høste...
16. september 2003 - 17:24
#13
oprette en toString()....? public String toString(){ return "Dette er en toString"; }
16. september 2003 - 17:26
#14
Ja ja... lidt mere avanceret bliver det jo nok... det der kan jeg også, jeg skriver lige senere... tak for hjælpen.
16. september 2003 - 17:36
#15
public String toString() { return "[name=" + name + ", items=" + items + "]"; } var måske værd at starte med.
16. september 2003 - 17:42
#16
Hvordan kan man returnere et objekts attribut?
16. september 2003 - 17:47
#17
Via en get metode.
16. september 2003 - 17:50
#18
public class Visitor { private String name; private Room location; private ArrayList items; public Visitor (String name, Room r) { } public Room location() { return Visitor.get(Room); } public void move(int dir) { } public void pickUp(Item i) { } } kan du ikke give mig et eksempel?
16. september 2003 - 18:14
#19
public Room getRoom(){ return location; }
16. september 2003 - 18:27
#20
Jeg ville nok kalde den: public Room getLocation() { return location; } det er kotyme at attribut xxxx hentes med getXxxx.
16. september 2003 - 18:45
#21
enig - hehe jeg var igen lidt for hurtig
16. september 2003 - 19:35
#22
Ja det ved jeg godt. Men jeg har en person som er tilknyttet Room r. r skal gerne kunne ændres og jeg skal også gerne kunne udskrive hans nuværende Room r. Sig til hvis i skal bruge mere kode og flere point :) /Kim
16. september 2003 - 19:44
#23
Hvis Visitor klassen har: public Room getLocation() { return location; } public void setLocation(Room location) { this.location = location; } så kan du både hente rum og ændre det.
16. september 2003 - 19:48
#24
visitor klassen: import java.util.*; public class Visitor { private String name; private Room location; private ArrayList items; public Visitor (String name, Room r) { name = name; location = r; } public Room location() { return location; } public void move(int dir) { if(Room.leadsTo(dir) != null) { location = Room.leadsTo(dir); } } public void pickUp(Item i) { } public void throwItem(Item i) { } } Room klassen: import java.util.*; public class Room { private List rooms; private ArrayList items; private String name; private Random randomGenerator = new Random(); public Room(String name) { rooms = new ArrayList(4); for (int i = 0; i<4; i++) { rooms.add(i, null); } items = new ArrayList(); this.name = name; } public void connectTo(int dir, Room r) { rooms.set(dir, r); } public boolean roomExists(int dir) { return rooms.get(dir) != null; } public Room leadsTo(int dir) { return (Room) rooms.get(dir); } public void addItem(Item i) { items.add(i); } public boolean itemExists() { return items != null; } public Item chooseItem() { int itemsSize = items.size(); int index = randomGenerator.nextInt(itemsSize); return (Item) items.get(index); } public void removeItem(Item i) { items.remove(i); } public String getName() { return name; } } ------------------------------------------- I move funktionen skal jeg gerne have sådan at hvis der findes et rum i den retning (dir) så skal hans location ændres til det nye rum... Jeg ved ikke helt hvordan det skal gribes an... Nogle forslag? På forhånd tak...
16. september 2003 - 20:16
#25
Der kan selvfølgelig godt blive tale om nogle flere point hvis der er hjælp at hente...
16. september 2003 - 20:20
#26
Det er ikke point men aftensmad der er problemet ! :-)
16. september 2003 - 20:21
#27
Jeg tro rikke at jeg forstår problemet. Virker: public void move(int dir) { if(Room.leadsTo(dir) != null) { location = Room.leadsTo(dir); } } ikke som det skal ?
16. september 2003 - 20:38
#28
Ah. leadsTo er ikke static og derfor compiler det ikke.
16. september 2003 - 20:41
#29
Du har blandet objektet "værelse" og objektet "liste over værelser" sammen. Det allebedste ville være at skille dem ad. Men lad os nøjes med det næstbedste. Du skal ændre: private List rooms; til: private static List rooms = new ArrayList(); og så skal de 3 metoder der bruger rooms også laves static. Så skulle du gerne være tilbage on track.
16. september 2003 - 21:00
#30
Ahh tak for hjælpen, men er det ikke lidt en fusker løsning? Det virker godt nok, men jeg er ikke så sikker på min instruktor syntes ideen er så god endda... men det kan da bruges? Er der nogen bivirkninger? Hvad er alternativet?
16. september 2003 - 21:22
#31
Det god alternativ er at have 2 klasser: Room og RoomList !
16. september 2003 - 21:30
#32
ja okay, min opgave er stillet sådan at den skal være der. Så det er den rigtige løsning. Tak for hjælpen...
Kurser inden for grundlæggende programmering