[Java] clonen lukt niet

Pagina: 1
Acties:

  • BeachPatroller
  • Registratie: November 2002
  • Laatst online: 24-04-2024
Stel ik heb een classe Node met pointer naar een andere node en data (container).
Wanneer ik een node wil clonen met een methode cloneNode.
code:
1
2
3
4
5
6
7
8
9
   public Node cloneNode(Node a){
        Node b = null;
        if(a!=null){
            a.clone(b);
            return b;
        }
        else
            return null;
    }


Krijg ik bij a.clone(b) een stack overflow error.
Wat doe ik hier fout?

Ik ben malle Pietje niet.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:59

.oisyn

Moderator Devschuur®

Demotivational Speaker

hoe moeten wij dat kunnen raden als we de implementatie van Node.clone(Node) niet kunnen zien?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Ik zou de node zichzelf laten klonen. (Er vanuit gaande dat je de java sax implementatie gebruikt)
//n is je orginale Node

Node m = null;
m = n.cloneNode(true);

Anders moet je precies specificeren wat je Node precies doet en opgezet is.

  • BeachPatroller
  • Registratie: November 2002
  • Laatst online: 24-04-2024
Ok, meer info
Ik gebruik deze functie als volgt
code:
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
    public Object clone(Node a){
        return this.clone(a);
    }
}

    public void addNode(String s) {
        Node tempNode = new Node(s); //creeer tempNode
        tempNode.nextNode = null;
        cursorNode = tempNode;
        if (rootNode == null) {
            rootNode = tempNode; //rootNode wordt eerste Node
        } else {
            lastNode.nextNode = tempNode;
        }
        lastNode = tempNode;
    }

    public Node cloneNode(Node a){
        Node b = null;
        if(a!=null){
            a.clone(b);
            return b;
        }
        else
            return null;
    }

    public void swap(Node a, Node b) {
        Node tempA = cloneNode(a);
        Node tempNextA = cloneNode(a.nextNode);
        if(tempA!=null)
            tempNextA = tempA.nextNode;         
        if (b!=null)
            a.nextNode = b.nextNode;
        a = b;
        b.nextNode = tempNextA;
        b = tempA;
    }

[ Voor 4% gewijzigd door BeachPatroller op 01-06-2005 14:50 ]

Ik ben malle Pietje niet.


  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 16-02 16:12
BeachPatroller schreef op woensdag 01 juni 2005 @ 14:44:
Ok, meer info
Ik gebruik deze functie als volgt
code:
1
2
3
4
5
    public Object clone(Node a){
        return this.clone(a);
    }
}
 ...
Kijk nog even goed wat je hier doet.
Op het moment dat je de clone functie aanroep, roept deze opnieuw this.clone(a) aan...

Misschien bedoelde je om super.clone() aan te roepen?

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:59

.oisyn

Moderator Devschuur®

Demotivational Speaker

Let wel dat clone() niet automatisch werkt; deze zul je zelf moeten implementeren door een nieuwe Node aan te maken en 'm dezelfde staat als de huidige node te geven. Of je een deep of shallow copy doet is aan jou (dwz, ga je alle child nodes ook clonen (deep copy) of laat je de nieuwe Node naar dezelfde kinderen wijzen (shallow copy)).

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op woensdag 01 juni 2005 @ 15:00:
Let wel dat clone() niet automatisch werkt; deze zul je zelf moeten implementeren door een nieuwe Node aan te maken en 'm dezelfde staat als de huidige node te geven. Of je een deep of shallow copy doet is aan jou (dwz, ga je alle child nodes ook clonen (deep copy) of laat je de nieuwe Node naar dezelfde kinderen wijzen (shallow copy)).
Klopt, de implementatie van bijvoorbeeld org.jdom geeft je een Element (Of Node) die door middel van een cloneNode een copy terug geeft waar de parameter true een deep copy teruggeeft, of anders een shallow.

  • BeachPatroller
  • Registratie: November 2002
  • Laatst online: 24-04-2024
Ik heb nog een lange weg te gaan :/ ik ga voor de shallow copy. Dank je voor de info.

Ik ben malle Pietje niet.


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Kleine sidestep: is een stackoverflow in Java altijd gevolg van een oneindige lus? Zoals hier de oneindige call naar clone(a)? Of zijn er nog andere (veel voorkomende) oorzaken van te verzinnen?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02-05 01:32
Je kunt ook gewoon veel recursiestappen maken (zonder dat het een oneindige lus is) en/of code schrijven die heel veel stackruimte nodig heeft. Met Java komt in de praktijk alleen het eerste voor.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Voor een shallow copy is een call naar super.clone() voldoende, mits je de standaard Cloneable interface implementeert.
Voor een deep copy, zul je voor elk element welke ge-deep copyt wordt van het object zelf clone() moeten aanroepen. Zie dit voorbeeld
Dat is in ieder geval de standaard methode van het implementeren van clone()

Verwijderd

.oisyn schreef op woensdag 01 juni 2005 @ 15:00:
Let wel dat clone() niet automatisch werkt; deze zul je zelf moeten implementeren door een nieuwe Node aan te maken en 'm dezelfde staat als de huidige node te geven.
Je kunt wel automatisch een deep copy maken in Java via het serializable mechanisme. Dit mechanisme loopt achter de schermen je hele object tree af. Als je in-memory serialized en meteen weer de-serialized heb je effectief een deep copy.

Enigste 'maar': Je moet je objecten markeren. Hiermee geef je aan dat je dit daarwerkelijk wilt. Omdat annotations nog niet bestonden vroeger, hebben ze hier een lege 'marker' interface voor genomen: Serializable.

Simpel voorbeeld van deze automatische deep copy:
code:
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
public static Object cloneObject(Object obj)  {
        
        Object tmp = null;
        
        try {
            ByteArrayOutputStream bOut = new ByteArrayOutputStream();
            ObjectOutputStream out     = new ObjectOutputStream(bOut);
            
            out.writeObject(obj);
            
            ByteArrayInputStream bIn =  new ByteArrayInputStream(bOut.toByteArray());
            ObjectInputStream in     =  new ObjectInputStream(bIn);
            
            tmp = in.readObject();
        }
        
        catch (ClassNotFoundException e) {      
            System.out.println(e.getMessage());
        }
        
        catch (NotSerializableException e) {            
            System.out.println("An exception of type NotSerializableException occured while serializing glyph");
            System.out.println(e.getMessage());         
        }       
        catch (IOException e) {
            System.out.println("An exception of type IOExecption occured while serializing glyph");         
            System.out.println(e.getMessage());         
        }
        
        return(tmp);
    }
Pagina: 1