Toon posts:

[Java] Collections.sort geeft nullpointer exception

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben bezig met de Huffman compressie in een binaire boom. Hiervoor heb ik een class Node gemaakt:

Omschrijving
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package huffman;

public class Node implements Comparable {

  private String teken;
  private Integer aantal;
  public Node leftChild, rightChild;

  public Node(String teken, int aantal, Node leftChild, Node rightChild) {
    this.teken = teken;
    this.aantal = new Integer(aantal);
    this.leftChild = leftChild;
    this.rightChild = rightChild;
  }

  public Node getLeftChild() {
    return this.leftChild;
  }

  public Node getRightChild() {
    return this.rightChild;
  }

  public int getAantal() {
    return this.aantal.intValue();
  }

  public String getTeken() {
    return this.teken;
  }

  public int compareTo(Object o) {
    Node andereNode = (Node)o;
    int resultaat = aantal.compareTo(andereNode.aantal);
    if (resultaat != 0) {
      return resultaat;
    }
    else {
      return teken.compareTo(andereNode.teken);
    }
  }

}


Nu wil ik de binaire boom opbouwen. Ter info:
frequentieList //bevat in eerste instantie instanties van de klasse Node
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 private List frequentieList;
...
...
...
 frequentieList = new LinkedList();
...
...
...
 while (frequentieList.size() > 1) {  
      Collections.sort(frequentieList); 
      Node left = (Node) frequentieList.remove(0);
      Node right = (Node) frequentieList.remove(0);
      int som = left.getAantal() + right.getAantal();
      frequentieList.add(new Node(null, som, left, right));
    }

frequentieList //bevat als het goed is nu de binaire boom.

De methode Collections.sort(frequentieList) geeft echter een java.lang.NullPointerException.

Daardoor knalt ook de JVM eruit:
Fatal exception occured. Program will exit.


Probleem
Het probleem lijk erin te zitten dat Collections.sort() problemen lijkt te hebben met de null waarde van het object wat gesorteerd moet worden. Als ik
Java:
1
frequentieList.add(new Node(null, som, left, right));

Vervang door:
Java:
1
frequentieList.add(new Node("", som, left, right));


Komt het probleem niet voor. Is het normaal dat de functie Collections.sort() eruit knalt als er null waardes gesorteerd moeten worden? Hoe lost ik dit op een goede manier op zonder dummy tekens aan te moeten maken?

Ter info
Als editor gebruik ik JBuilder Foundation X, met JDK 1.4

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik neem aan dat de Compareble interface voor de sort nodig is, en dat er dus ook een echt object aanweizg moet zijn.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Hij moet toch op de een of andere manier de objecten met elkaar vergelijken om ze te sorteren? Standaard zal hij daarvoor wel de hashCode methode gebruiken die elk object hoort te hebben. En een null waarde heeft dat dus niet.

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 15:05

RayNbow

Kirika <3

Het komt omdat je compareTo van je Node niet werkt met null pointers :P

Java:
1
2
3
4
5
6
7
8
9
10
11
12
  public int compareTo(Object o) {
    Node andereNode = (Node)o;
    int resultaat = aantal.compareTo(andereNode.aantal);
    if (resultaat != 0) {
      return resultaat;
    }
    else {
      return teken.compareTo(andereNode.teken);
    }
  }

}


Bekijk regel 8 maar eens goed.

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • momania
  • Registratie: Mei 2000
  • Laatst online: 12:06

momania

iPhone 30! Bam!

Verwijderd schreef op 04 juni 2004 @ 17:52:

Java:
1
2
3
4
5
6
  public Node(String teken, int aantal, Node leftChild, Node rightChild) {
    this.teken = teken;
    this.aantal = new Integer(aantal);
    this.leftChild = leftChild;
    this.rightChild = rightChild;
  }

Java:
1
2
3
4
5
6
7
8
9
10
  public int compareTo(Object o) {
    Node andereNode = (Node)o;
    int resultaat = aantal.compareTo(andereNode.aantal);
    if (resultaat != 0) {
      return resultaat;
    }
    else {
      return teken.compareTo(andereNode.teken);
    }
  }
Kijk, als je je class aanmaaakt en je geeft als 'teken' null mee, maar met je compareTo is je
restultaat 0, dan probeer je teken.compareTo.
Dat gaat dus nooit werken als teken null is.

Verder moet je vanuit compareTo niet een 2e keer compareTo gaan aanroepen.
de bedoeling van compareTo is dat je het huidige object vergelijkt met je parameter en daarop alleen maar antwoord met -1, 0 of 1.
Meer niet.

Wacht, dit mag natuurlijk wel gewoon.

Belangrijkste hier is dat je gewoon dus geen null values kan comparen ;)

[ Voor 6% gewijzigd door momania op 04-06-2004 18:08 ]

Neem je whisky mee, is het te weinig... *zucht*


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

bigbeng schreef op 04 juni 2004 @ 18:03:
Hij moet toch op de een of andere manier de objecten met elkaar vergelijken om ze te sorteren? Standaard zal hij daarvoor wel de hashCode methode gebruiken die elk object hoort te hebben. En een null waarde heeft dat dus niet.
Ik mag hopen van niet :P Op basis van een hashcode kan je niet bepalen of een object voor of na een ander object moet komen.
Pagina: 1