Avatar billede skurggman Nybegynder
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);
    }
Avatar billede repsak Nybegynder
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(...);
Avatar billede arne_v Ekspert
16. september 2003 - 17:07 #2
Der må kun være 2 muligheder for NullPointerException: enten er items null
eller så er randomGenerator null.
Avatar billede skurggman Nybegynder
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);
    }
}
Avatar billede arne_v Ekspert
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)
Avatar billede repsak Nybegynder
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
Avatar billede arne_v Ekspert
16. september 2003 - 17:12 #6
randomGenerator er ikke initialiseret.

private Random randomGenerator = new Random();
Avatar billede repsak Nybegynder
16. september 2003 - 17:14 #7
arne_v  -> ja det har du nok ret i (bare en hurtig indskydelse :-)
Avatar billede skurggman Nybegynder
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" ??
Avatar billede arne_v Ekspert
16. september 2003 - 17:19 #9
Hvilket symbol kan den ikke resolve ?
Avatar billede repsak Nybegynder
16. september 2003 - 17:20 #10
items er af typen Collection, som ikke indeholder en get.
Brug istedet interfacet List
Avatar billede skurggman Nybegynder
16. september 2003 - 17:21 #11
Hmm jeg har fikset det, jeg ændrede min Collection til en ArrayList...
Avatar billede skurggman Nybegynder
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...
Avatar billede repsak Nybegynder
16. september 2003 - 17:24 #13
oprette en toString()....?
public String toString(){
return  "Dette er en toString";
}
Avatar billede skurggman Nybegynder
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.
Avatar billede arne_v Ekspert
16. september 2003 - 17:36 #15
public String toString() {
  return "[name=" + name + ", items=" + items + "]";
}

var måske værd at starte med.
Avatar billede skurggman Nybegynder
16. september 2003 - 17:42 #16
Hvordan kan man returnere et objekts attribut?
Avatar billede arne_v Ekspert
16. september 2003 - 17:47 #17
Via en get metode.
Avatar billede skurggman Nybegynder
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?
Avatar billede repsak Nybegynder
16. september 2003 - 18:14 #19
public Room getRoom(){
return location;
}
Avatar billede arne_v Ekspert
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.
Avatar billede repsak Nybegynder
16. september 2003 - 18:45 #21
enig - hehe jeg var igen lidt for hurtig
Avatar billede skurggman Nybegynder
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
Avatar billede arne_v Ekspert
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.
Avatar billede skurggman Nybegynder
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...
Avatar billede skurggman Nybegynder
16. september 2003 - 20:16 #25
Der kan selvfølgelig godt blive tale om nogle flere point hvis der er hjælp at hente...
Avatar billede arne_v Ekspert
16. september 2003 - 20:20 #26
Det er ikke point men aftensmad der er problemet !

:-)
Avatar billede arne_v Ekspert
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 ?
Avatar billede arne_v Ekspert
16. september 2003 - 20:38 #28
Ah.

leadsTo er ikke static og derfor compiler det ikke.
Avatar billede arne_v Ekspert
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.
Avatar billede skurggman Nybegynder
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?
Avatar billede arne_v Ekspert
16. september 2003 - 21:22 #31
Det god alternativ er at have 2 klasser: Room og RoomList !
Avatar billede skurggman Nybegynder
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...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester