Warum Stackoverflow oder Nullpointerexeption?

Status
Nicht offen für weitere Antworten.
J

JTB

Gast
Habe folgenden Code und suche seit ca. 6 Stunden warum ich das cniht copyn kann


Code:
class Artikel
{
	
    int artNr;            // Artikelnr
    double einzelpreis;
    int anzahl;
    Artikel weitere;    // weitere Artikel in diesem Korb werden
                        // hier angehängt.
   
    Artikel (int art , int anz , double  preis){
        artNr = art;
        einzelpreis = preis;
        anzahl = anz;
    }
    public Artikel copy(){
    	Artikel kopie;
    	kopie=new Artikel(artNr,anzahl,einzelpreis);
    	if (weitere==null){
    		return kopie;
    	}else{
    		kopie.weitere=weitere.copy();
    		return kopie;
    	}
    }
}

Wenn ich normal zwei Artikel kopiere funktioniert das. Scheinbar. Aber wenn ich es in dieser klasse aufrufe, gibts die ober erwähnten Fehler. Also braucht euch nur raunehmen() ODER listeanzeigen() ODER wert() angucken ist bei allen das gleiche Problem. Weil da halt copy() aufgerufen wird.

Code:
public class Warenkorb {

    int wkId;      // eindeutige Nr. des Korbs
    int kdNr;   // eindeutige Nr. des Kunden, der diesen WK benutzt
    long zeit;
    Artikel imKorb;
    double warenwert (){
    	return wert(imKorb);
    }
    private double wert(Artikel rest){
    	Artikel korb1 = rest.copy();
    	double erg;
    	if (korb1==null){
    		return 0;
    	}else{
    		erg = korb1.anzahl*korb1.einzelpreis;
    		erg+= this.wert(korb1.weitere);
    	}
    	return erg;
    	
    }
    public void inDenKorb(Artikel a){
    	if(imKorb==null){
    		imKorb= new Artikel(a.artNr,a.anzahl,a.einzelpreis);
    	}else{
    		imKorb.weitere=imKorb;
        	imKorb.anzahl=a.anzahl;
        	imKorb.artNr=a.artNr;
        	imKorb.einzelpreis=a.einzelpreis;	
    	}
    }
    public void rausnehmen(Artikel a){
    	Artikel ueber = imKorb.copy();
    	while (ueber!=null){
    		if (ueber.artNr==a.artNr){
    			if (ueber.anzahl<= a.anzahl){
    				ueber=ueber.weitere.copy();
    			}else{
    				ueber.anzahl-=a.anzahl;
    			}
    		}
    		ueber=ueber.weitere;
    	}
    	
    }
    public void listeanzeigen(){
    	Artikel ueber = imKorb.copy();
    	//while (ueber!=null){
    		//System.out.println("ArtNr.:"+ueber.artNr+" Anzahl:"+ueber.anzahl+" Preis"+ueber.einzelpreis);
    		//ueber=ueber.weitere;
    		
    	//}
    	
    }
    Warenkorb (int wk, int kd, long zeitstempel){
        this.wkId=wk;
        this.kdNr=kd;
        this.zeit=zeitstempel;
    }
}

Wenn falscher Bereich dann bitte verschieben.
LG
JTB
 
J

JTB

Gast
PS: Stackoverflow ist bei dieser Rekursionsmethode. NullPointerexeption wen ic das in while schreibe.
 
B

Beni

Gast
Bilden deine Artikel vielleicht einen Kreis? Besonders diese Zeile kommt mir sehr verdächtig vor (in der Methode "inDenKorb"):
Code:
imKorb.weitere=imKorb

[Edit: die ganze "inDenKorb"-Methode macht wenn Sinn. Da fehlt eindeutig irgendwo das "new Artikel" wenn schon ein Artikel im Korb ist]
 
J

JTB

Gast
Also die Liste ist kein Kreis.

Ok hab nochmal getestet also ob copy richtig funktioniert .. und es schient nciht zu funktionieren. Gibt bei dem Test nen Nullpointerexeption aus.
 
B

Beni

Gast
JTB hat gesagt.:
Also die Liste ist kein Kreis.
Hast du Beweise?





Wenn man es im Debugger anschaut, sieht es nämlich wirklich sehr kreisartig aus (das "id=20" sagt eigentlich alles):
image_10.png


Oder auch als direkt ausführbarer Code:
Code:
    public static void main( String[] args ) {
        Warenkorb korb = new Warenkorb( 0, 0, 0 );
        korb.inDenKorb( new Artikel( 0, 1, 23 ) );
        korb.inDenKorb( new Artikel( 1, 1, 47 ) );
        
        // und nun ein Test...
        Artikel base = korb.imKorb;
        int gremlins = 10;
        
        System.out.println( "Nun sollten zwei verschiedene Objekte im Warenkorb sein..." );
        
        while( base != null && gremlins > 0 ){
            System.out.println( System.identityHashCode( base ));
            gremlins--;
        }
        
        System.out.println( "finish" );
    }
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben