Datentypen List - gleiche Einträge bei neuen Objekten

  • Themenstarter Themenstarter JayGabriel
  • Beginndatum Beginndatum
J

JayGabriel

Gast
Hallo, ich hoffe, mir kann hier jemand weiter helfen und hoffe, dass ich hier auch richtig bin.

Mein Problem:
Ich hole mit über ein WebService ein Datanarray, welches ich selbst noch aufbereiten muss, um die entsprechenden Werte
in einer ArrayList von einer selbst erstellten Struktur zu speichern.

Das Auslesen über den WebService klappt soweit, mit Testausgaben habe ich die Einträge überprüft.
Jetzt wollte ich die ArrayList in einer For Schleife füllen lassen und gehe mit der Zählvariablen i durch das mir zugeschickte
Array. Mit add(Objekt) hatte ich es als erstes Versucht, dass das nicht klappt ist klar, da es nur Refferenzen speichert.
Doch auch wenn ich "add(new Objet("meineWerte")" benutze, habe ich jedes Mal die gleichen Einträge nur noch in dem
ArrayList.

Kann mir jemand sagen, wo mein Denkfehler sein könnte? Nicht mal mit einem Array statt einer ArrayList, wo ich explizit
die Felder, wo er hineinschreiben soll mit den Zählvariablen bzw. hardcoded eintrage, klappt es.

Code:

Java:
//das ist das Array, was ich mir herhole
subs_list = mmod.getSubscriptionInformations(clientID);

for(int i=0; i<subs_list.length; i++) {
    //hier leg ich mir eine neue Struktur an, um meine Werte schließlich entsprechend dann zuzuordnen
    subscription = new SubscriptionData();

    //da es ein Test ist, lass ich nur Testwerte erst einmal eintragen
    subscription.setProdukt("produkt"+i);

    //hinzufügen
    subscriptions.add(subscription);

    //testausgabe
    testausgabe = subscriptions.get(0).getProdukt();
}//for

Die Struktur SubscriptionData besteht nur aus 5 StringVariablen, mit den entsprechenden Gettern und Settern und zwei Konstruktoren (einer leer, einer mti dem man die 5 Werte gleich übergeben kann).

Ich denk, es wird einfach nur ein Knoten in meinem Gehirn sein, aber ich hoff, ich könnt mir trotzdem helfen. 😉

mfg
Jay
 
Zuletzt bearbeitet von einem Moderator:
[c]testausgabe = subscriptions.get(0).getProdukt();[/c]
->
[c]testausgabe = subscriptions.get(i).getProdukt();[/c]
?

"geaddete" Objekte werden hinten angehängt.
 
das ist schon klar, dass die hinten angehängt werden. Aber die geaddeten Objekte überschreiben bei mir ständig die
Objekte, die vor ihnen geaddet wurden!

mit meiner testausgabe versucht ich auf das erste Objekt (also 0) der Liste zuzugreifen, um zu sehen, ob auch das
erste und nicht das letzte drin steht. Aber auch wenn ich auf eins in der Mitte zugreifen, ist es egal, denn es ist immer
das gleiche.
 
Da fällt mir gerade auf, du machst in der Schleife gar keine Ausgabe. Diese Variable wird dann natürlich immer überschriben. Poste doch den gesamten Code des Tests und/oder ein KSKB.
 
Das wär meine gesamte Methode, die sich halt die Daten aus ner Klasse holt, die den WebService anspricht.
Ausgelöst wird die Methode, wenn man auf ner Webseite nen Button klickt.

Java:
public void processAction(ActionEvent arg0) throws AbortProcessingException {
    mmod = Model.getInstanz();
    helper = new ToStringHelpClass();
    subscriptions = new ArrayList<SubscriptionData>();
    mmod.setClientID(clientID);
    client = mmod.getClientInformations(clientID);
  
    if(client != null)
    {
      name = client.getName();
      firstname = client.getFirstName();
      
      subs_list = mmod.getSubscriptionInformations(clientID);
      for(int i=0; i<subs_list.length; i++) {
        subscription = new SubscriptionData();
        subscription.setProdukt("produkt"+i);
        //subscriptions.add(new SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
        subscriptions.add(subscription);
        testausgabe = subscriptions.get(0).getProdukt();
      }//for
    }//if(client != null)
  }

Innerhalb hab ich auch die andere Variante noch als Kommentar stehen, wie ich es auch schon versucht habe.
In dieser Funktion will ich aber auch nur die ArrayList setzen lassen und später anderweitig ausgeben lassen.
 
Ich will nicht die gesamte Liste ausgeben, sondern nur eine Stelle... in dem Beispiel greif ich gerade auf die erste (also 0) zu. Aber es geht ja um den Inhalt, nicht die Ausgabe (ist ja nur ein Test, um zu sehen, was denn los ist) ...
 
Hab deinen Ursprungspost nochmals gelesen und nun ist mir nicht mehr ganz klar, was das Problem sein soll.
Behauptest du gerade, dass in der [c]List[/c] x Mal das gleiche Objekt drin ist?
Oder willst du einfach nur Klone der ursprünglichen Objeke (aus dem Array) in die List speichern?
Veränderst du denn die Daten in der Liste und benötigst im Array noch die ursprünglichen o.ä.?
 
meine SubscriptionData.java, besonders viel steht da halt aber nicht drin.

Java:
public class SubscriptionData {
  private String produkt;
  private String abboart;
  private String start;
  private String ende;
  private String anzahl;
  
  public SubscriptionData(String produkt, String abboart, String start, String ende, String anzahl) {
    this.setProdukt(produkt);
    this.setAbboart(abboart);
    this.setStart(start);
    this.setEnde(ende);
    this.setAnzahl(anzahl);
  }
  
  public SubscriptionData() { 
  }

  public void setProdukt(String produkt) {
    this.produkt = produkt;
  }

  public String getProdukt() {
    return produkt;
  }

  public void setAbboart(String abboart) {
    this.abboart = abboart;
  }

  public String getAbboart() {
    return abboart;
  }

  public void setStart(String start) {
    this.start = start;
  }

  public String getStart() {
    return start;
  }

  public void setEnde(String ende) {
    this.ende = ende;
  }

  public String getEnde() {
    return ende;
  }

  public void setAnzahl(String anzahl) {
    this.anzahl = anzahl;
  }

  public String getAnzahl() {
    return anzahl;
  }

}//class SubscriptionData

Zu meinem Problem noch mal:
Ich bekomme ein Array aus einem WebService. Da muss man sich die Daten aber noch herausfieseln, was ich eigentlich in dieser Methode hier machen wollte. Also neue SubscriptionData Instanz erzeugen, die gebrauchten Werte (Produkt, aboart, start, ende, anzahl) setzen und das "neue Objekt" dann dem ArrayList zur Aufbewahrung hinzufügen.

Ausgabe ist in dieser Methode nicht gewünscht. Meine Testausgabe hab ich nur hineingeschrieben, um zu sehen, wo der Fehler ist.
Und irgendwie überschreibt mir die For Schleifen halt immer alle Objekte in der ArrayList und hängt es nicht nur hinten an.
 
Kann da auf Anhieb keinen Fehler in der Klasse und in der Schleife finden.
Mach doch mal ein paar Ausgaben in der Schleife. Lass Dir z.B. direkt Schleifenzähler und ...get(0).getProdukt() in der Schleife ausgeben - ohne das in testausgabe zwischen zu speichern.
Vielleicht liegt ja der Fehler wo anders.
 
der bisherige Code enthält keinen Fehler und auch wenig bis keine Information darüber wo du je irgendwas tatsächlich verifizierst,
man könnte deine Vermutungen einfach falsch nennen, alles funktioniert

Java:
public class Test {
    public static void main(String[] args) {
        List<SubscriptionData> subscriptions = new ArrayList<SubscriptionData>();
        String testausgabe = "";
        SubscriptionData subscription;
        for (int i = 0; i < 4; i++) {
            subscription = new SubscriptionData();
            subscription.setProdukt("produkt" + i);
            // subscriptions.add(new
            // SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
            subscriptions.add(subscription);
            testausgabe = subscriptions.get(0).getProdukt();
        }// for

        System.out.println("testausgabe: " + testausgabe);
        for (int i = 0; i < 4; i++)  {
            System.out.println("i: " + i + ", " + subscriptions.get(i).getProdukt());
        }// for
    }
}
Ausgabe:
Code:
testausgabe: produkt0
i: 0, produkt0
i: 1, produkt1
i: 2, produkt2
i: 3, produkt3
 
Tja, nach meinem Empfinden hab ich auch nirgends einen Fehler drin, aber wie schon mehrmals geschrieben, es werden tatsächlich immer nur die gleichen Einträge schließlich ausgegeben.

Ausgabe:
Code:
i=0 - produkt5
i=1 - produkt5
i=2 - produkt5
i=3 - produkt5
i=4 - produkt5
i=5 - produkt5

Ich hab das gesamte Projekt sogar schon neu aufgesetzt und einzeln und Schritt für Schritt noch einmal nachporgrammiert.
Immer wieder taucht der Fehler auf... Hab schon das Gefühl, dass Eclipse dran Schuld ist, und mich nur ärgner will 😉

Zur Ausgabe:
meine Ausgabe wird von einem JSP übernommen in einer JSF Umgebung (oder wie man das nennt), aber die lass ich ja bisher sogar außenvor, da ich ja schob beim Befüllen der ArrayList Probleme hab...

Kann es eigentlich passieren, dass ein new die gleiche Referenz auf ein neues Objekt mehrmals erzeugt?
 
mit welchem Code testest du denn an welcher Stelle auf welche Weise?
deine Ausgabe läßt nicht vermuten, dass du genau meinen Code verwendet hast

> Kann es eigentlich passieren, dass ein new die gleiche Referenz auf ein neues Objekt mehrmals erzeugt?

wahrscheinlich nein, aber es kann passieren dass du komische Sachen erzählst die dann falsch verstanden werden,
gibt es denn 'unterschiedliche Referenzen auf ein neues Objekt'?
 
Also:

oben ist die testausgabe Variable (vom Typ String), der geb ich jenachdem welche Stelle ich aus dem ArrayList herauslesen will, den entsprechenden Wert durch eine hardcodet Zahl (also 0 oder halt jenachdem).
Dann deploy ich und schau nach, was in der Variablen steht (die wird von einem JSP ausgelesen und angezeigt - als Label, daher immer nur eine Angabe) Es sind immer gleich viele For Schleifendurchläufe, daher kann ich die Werte auch einfach hardcodet hineinschreiben ohne OutOfBounds zu erzeugen...

das mit dem i=0 ist das, was ich in der Zeile testausgabe = subscriptions.get(0).getProdukt(); halt eintrage. Das
produkt5 ist das, was dann angezeigt wird... habs doch nur verdeutlichen wollen *seufz*

Wenn ich innerhalb der For Schleife die Variable nur dann setzen lasse, wenn i == 0 ist, dann steht das richtige drin.
Später, nachdem die For komplett durchgelaufen ist, steht an der gleichen Stelle produkt5 drin.
 
meine Importe:

import java.util.List;
import java.util.ArrayList;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import javax.faces.component.UICommand;
import javax.faces.component.UIForm;
import javax.faces.model.SelectItem;

Ja, es sind die util Importe und nein, ich hab mir da nichts eigenes erstellt und auch nicht durch Überladung oder sonstwas dran rumgedocktert.
 
mit Text a la 'Wenn ich innerhalb der For Schleife die Variable nur dann setzen lasse' kannst du kommen wenn auf allen Seiten klare Verständnisse herschen und in schnellen Schritten erfolgreich exakte Probleme besprochen und gelöst werden,

im Moment sage persönlich dazu nur: spar dir die Buchstaben und poste Code, ansonsten ist dir nicht zu helfen
 
Dann also in Minischritten...

Das war die Variante, die ich oben gepostet hab. Hier wird testausgabe immer wieder neu bei jedem Durchlauf der For Schleife neu gesetzt (das weiß ich). Im Endeffekt steht nach der Ausführung schließlich "produkt5" auf meiner Seite (mehr wird nicht ausgeben).
Java:
for(int i=0; i<subs_list.length; i++) {
        subscription = new SubscriptionData();
        subscription.setProdukt(helper.parseProductCode(subs_list[i].getProductCode()));
        //subscriptions.add(new SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
        subscriptions.add(subscription);
        testausgabe = subscriptions.get(0).getProdukt();
      }//for


Ein weiterer Versuch war, mir direkt bei einem bestimmten Schleifendurchlauf den aktuellen Wert ausgeben zu lassen. Am Code wurde dafür nicht viel geändert, daher dachte ich, dass das irrelevant ist fürs Posten...
Bei dieser Variante wird tatsächlich produkt0 ausgegeben. Also schloss ich daraus, dass in dem nächsten Schleifendurchlauf tatsächlich das erste überschrieben wird.
Java:
for(int i=0; i<subs_list.length; i++) {
        subscription = new SubscriptionData();
        subscription.setProdukt(helper.parseProductCode(subs_list[i].getProductCode()));
        //subscriptions.add(new SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
        subscriptions.add(subscription);
        if(i==0)
                testausgabe = subscriptions.get(0).getProdukt();
      }//for

die foglenden Versuche ergaben alle produkt3
Java:
for(int i=0; i<subs_list.length; i++) {
        subscription = new SubscriptionData();
        subscription.setProdukt(helper.parseProductCode(subs_list[i].getProductCode()));
        //subscriptions.add(new SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
        subscriptions.add(subscription);
        if(i==3)
                testausgabe = subscriptions.get(3).getProdukt();
      }//for


Java:
for(int i=0; i<subs_list.length; i++) {
        subscription = new SubscriptionData();
        subscription.setProdukt(helper.parseProductCode(subs_list[i].getProductCode()));
        //subscriptions.add(new SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
        subscriptions.add(subscription);
        if(i==3)
                testausgabe = subscriptions.get(2).getProdukt();
      }//for


Java:
for(int i=0; i<subs_list.length; i++) {
        subscription = new SubscriptionData();
        subscription.setProdukt(helper.parseProductCode(subs_list[i].getProductCode()));
        //subscriptions.add(new SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
        subscriptions.add(subscription);
        if(i==3)
                testausgabe = subscriptions.get(1).getProdukt();
      }//for


Java:
for(int i=0; i<subs_list.length; i++) {
        subscription = new SubscriptionData();
        subscription.setProdukt(helper.parseProductCode(subs_list[i].getProductCode()));
        //subscriptions.add(new SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
        subscriptions.add(subscription);
        if(i==3)
                testausgabe = subscriptions.get(0).getProdukt();
      }//for

Ist es so besser? Was genau wollt ihr noch? Mehr an Quelltext, außer wo ich den internen WebService aufrufe, hab ich ja noch nicht. Höchstens noch meine JSP.
 
nun, ein bisschen verständlicher ist es für mich geworden, dann gehe ich jetzt auch auf deine Stichpunkte Deploy + JSP ein:
kann es nicht sein, dass du irgendwo alten Code wiederverwendest? eine immer gleiche Ausgabe ist ein schlechter Beweis für irgendwas

vergleiche dagegen:
Java:
if(i==3) {
   testausgabe = "teste i == 3: "+subscriptions.get(3).getProdukt();
}
mit später
Java:
if(i==2) {
   testausgabe = "teste i == 2: "+subscriptions.get(2).getProdukt();
}
kommt immer noch immer produkt3 raus, aber mal mit "i == 3", mal mit "i == 2"?
das wäre übel, aber damit wären wenigstens Probleme beim Kompilieren usw. ausgeschlossen

natürlich kann, wenn man sowas macht, gleich auf komplettes Rätselraten verzichten und den String testausgabe umfassend zusammenbauen:
Java:
vor der Schleife:
testausgabe = "jetzt kommt Schleife mit .. Elementen ";

in der Schleife:
testausgabe += " - i: " + i + ", " + subscriptions.get(i).getProdukt();
wobei das noch gar nicht soviel aussagt, wenn jeder Schleifendurchlauf alle Elemente ändern würde, könnte diese Ausgabe das nicht erkennen,
lieber nach der Befüllungs-Schleife nochmal die Liste durchgehen, siehe mein Testprogramm
 
Was hier von dir gewünscht wird ist ein Nachvollziehbares Beispiel, wie die Vorposter schon geschrieben haben sieht der von dir gepostete Code soweit gut. Also muss der Fehler zum Beispiel in der Ausgabe liegen. Dazu werden einfach mehr Informationen von
dir benötigt. Modifiziere den Code doch einmal auf die folgende Weise und poste dann die Ausgabe:

Java:
for(int i=0; i<subs_list.length; i++) {
        subscription = new SubscriptionData();
        subscription.setProdukt("product" + i);
        subscriptions.add(subscription);
      }//for
for(SubscriptionData data: Subscription) {
    System.out.println(data.getProduct());
}

Alternativ solltest du besser einen Logger verwenden und das Ganze mal mit einem Debugger durchchecken.
 
check doch mal das Ergebnis von hier:

Code:
subs_list = mmod.getSubscriptionInformations(clientID);

ich denke hier werden schon dieselben reinkommen.


edit: der Fehler kann nicht in deinem vorherigen Beispiel liegen.
 
Hab mir grad ne verspätete Mittagspause gegönnt, daher hats etwas gedauert mit der Umsetzung. Aber jetzt wirds noch irrer...

@SlaterB:
habs umgeschrieben wie folgt:
Java:
      testausgabe = "Vor der Schleife mit Länge: "+subs_list.length;
      for(int i=0; i<subs_list.length; i++) {
        subscriptions.add(new SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
        subscriptions.add(subscription);
        testausgabe += "| Subscriptions (ArrayList) ("+i+"): "+subscriptions.get(i).getProdukt()+" --- ";
      }//for
      
      testausgabe += "Nach der Schleife in einer weiteren Schleife für einfache Ausgabe: ";
      for(int i=0; i<6; i++) {
        testausgabe += subscriptions.get(i).getProdukt()+", ";
      }

Und die Ausgabe sieht daraufhin wie folgt aus (wegen Übersichtlichkeit hab ich ein paar Enter eingefügt)
Code:
Vor der Schleite mit Länge: 6
| Subscriptions (ArrayList) (0): produkt0 ---
| Subscriptions (ArrayList) (1): produkt1 --- 
| Subscriptions (ArrayList) (2): produkt2 --- 
| Subscriptions (ArrayList) (3): produkt3 --- 
| Subscriptions (ArrayList) (4): produkt4 --- 
| Subscriptions (ArrayList) (5): produkt5 --- 
Nach der Schleife in einer weiteren Schleife für einfache Ausgabe:
produkt5, produkt5, produkt5, produkt5, produkt5, produkt5,
Das zeigt mir wieder das Problem, dass es wohl richtig im ersten Schritt hineingeschrieben, danach aber wieder überschrieben wird...

@faetzminator: Auf den Inhalt von subs_list, greif ich zum Testen ja erst einmal nicht zu (sonst würde statt produkt0 FR und so drin stehen) Die Einträge für die ArrayList werden direkt durch die Schleife hardcodet erzeugt und nur der Zählparameter i hinten drangehaben, damit ich den Unterschied sehen kann.

@tommysenf: Hmm, ich glaube, ich sollte für heute Schluss machen... o.ô
Nachdem ich den Code an deine Version umgeschrieben habe, hat mein Array nun plötzlich 12 Einträge und nicht nur 6.

Code:
Java:
testausgabe = "Vor der Schleife mit Länge: "+subs_list.length;
      for(int i=0; i<subs_list.length; i++) {
        subscriptions.add(new SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
        subscriptions.add(subscription);
        //testausgabe += "| subs_list["+i+"]: "+subs_list[i].getProductCode();
        //testausgabe += "| Subscriptions (ArrayList) ("+i+"): "+subscriptions.get(i).getProdukt()+" --- ";
      }//for
  
      testausgabe += "Länge der ArrayList: "+subscriptions.size()+"---";
      testausgabe += "Nach der Schleife in einer weiteren Schleife für einfache Ausgabe: ";
      for(SubscriptionData data: subscriptions) {
        testausgabe += data.getProdukt()+", ";
      }

Ausgabe:
Code:
Vor der Schleife mit Länge: 6
Länge der ArrayList: 12---
Nach der Schleife in einer weiteren Schleife für einfache Ausgabe: 
produkt5, null, produkt5, null, produkt5, null, produkt5, null, produkt5, null, produkt5, null,

Oder hab ich bei der Umsetzung deiner For Schleife, etwas falsch gemacht?

@fastjack:

Java:
subs_list = mmod.getSubscriptionInformations(clientID);
      testausgabe = "Vor der Schleife mit Länge: "+subs_list.length;
      for(int i=0; i<subs_list.length;i++) {
        testausgabe += subs_list[i].getProductCode()+", ";
      }
      
      for(int i=0; i<subs_list.length; i++) {
        subscriptions.add(new SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
        subscriptions.add(subscription);
        //testausgabe += "| subs_list["+i+"]: "+subs_list[i].getProductCode();
        //testausgabe += "| Subscriptions (ArrayList) ("+i+"): "+subscriptions.get(i).getProdukt()+" --- ";
      }//for

Code:
Vor der Schleife mit Länge: 6
FR, ,BZ,FA,BK, ,

Also ankommen tun die Werte richtig. Auch die Leerstellen " " sind korrekt, da ich die später noch herausfiltern soll.
 
Code:
Java:
testausgabe = "Vor der Schleife mit Länge: "+subs_list.length;
      for(int i=0; i<subs_list.length; i++) {
        subscriptions.add(new SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
        subscriptions.add(subscription);
        //testausgabe += "| subs_list["+i+"]: "+subs_list[i].getProductCode();
        //testausgabe += "| Subscriptions (ArrayList) ("+i+"): "+subscriptions.get(i).getProdukt()+" --- ";
      }//for
  
      testausgabe += "Länge der ArrayList: "+subscriptions.size()+"---";
      testausgabe += "Nach der Schleife in einer weiteren Schleife für einfache Ausgabe: ";
      for(SubscriptionData data: subscriptions) {
        testausgabe += data.getProdukt()+", ";
      }

Warum ruffst du ZWEI Mal add auf?

Die Zeile:
subscriptions.add(subscription);

Das Objekt kann nur "null" sein. Weil es nicht initialisiert ist
 
dass alle Einträge dasselbe Produkt haben bekommt man relativ leicht hin wenn die Attribute wie 'String produkt' statisch wären,

die 'produkt5, null, produkt5, null, '-Ausgabe ist noch merkwürdiger, widerspricht dem statischen Attribut,
deutet einerseits auch auf irgendwas komisches in SubscriptionData hin, andererseits ist da nicht wirklich irgendwas auch anzunehmen

-------
edit:
> Warum ruffst du ZWEI Mal add auf?
ok, damit könnte in der Richtung etwas geklärt sein, übersehen..

sind bei der ersten Schleife dann auch 12 Elemente drin? wieso dort aber kein null..
zum [c]("+i+"): "+subscriptions.get(i)[/c] in der Schleife passt das aber auch nicht
--------


ziemlich irre, wenn du Lust hast kannst du zum weitertesten folgendes verwenden bzw. vergleichbares eigenes

Java:
class Test
{
    public static void main(String[] args)
    {
        List<SubscriptionData> subscriptions = new ArrayList<SubscriptionData>();
        String testausgabe = "";
        SubscriptionData subscription;
        for (int i = 0; i < 4; i++)
        {
            subscription = new SubscriptionData("produkt" + i, "", "", "", "");
            // subscriptions.add(new
            // SubscriptionData("produkt"+i,"abboart"+i,"start"+i,"ende"+i,"anzahl"+i));
            subscriptions.add(subscription);
            testausgabe = subscriptions.get(0).getProdukt();
        }// for

        System.out.println("testausgabe: " + testausgabe);
        for (int i = 0; i < 4; i++)
        {
            System.out.println("i: " + i + ", " + subscriptions.get(i).getProdukt());
        }// for

    }
}


class SubscriptionData
{
    private final IdString produkt;

    public SubscriptionData(String produkt, String abboart, String start, String ende, String anzahl)
    {
        this.produkt = new IdString(produkt);
    }

    public SubscriptionData()
    {
        this.produkt = new IdString("nix");
    }

    public void setProdukt(String produkt)
    {
    }

    public String getProdukt()
    {
        return produkt.toString();
    }

    public void setAbboart(String abboart)
    {
    }

    public String getAbboart()
    {
        return null;
    }

    public void setStart(String start)
    {
    }

    public String getStart()
    {
        return null;
    }

    public void setEnde(String ende)
    {
    }

    public String getEnde()
    {
        return null;
    }

    public void setAnzahl(String anzahl)
    {
    }

    public String getAnzahl()
    {
        return null;
    }

}


class IdString
{
    private static int count=75;
    private int number;
    private String st;

    public IdString(String st)
    {
        this.number = count++;
        this.st = st;
    }

    public String toString()
    {
        return number + "/" + st;
    }
}
nett ist allein schon, überhaupt irgendwie die SubscriptionData-Klasse zu ändern, um gegen alten Code vielleicht noch mit statischer Variable vorzugehen, auch wenn das offensichtlich nicht zu allen deinen Ausgaben passt,
ich habe hier alles außer Produkt entfernt, kannst du vielleicht nicht ganz so extrem machen ohne dass dein Programm abschmiert,
die Produkte werden einmalig gesetzt, sind durch final quasi nicht mehr zu ersetzen, zu ändern schon gar nicht,
jeder IdString hat außerdem eine eindeutige Nummer, wenn nötig kann bei unbekannten Fund durch Logging herausgefunden werden wo und wann das Objekt je erzeugt wurde,
die Nummerierung beginnt bei 75, um nicht unnötig mit den 0, 1, 2, 3 der Listen in Konflikt zu kommen

Ausgabe meines Programms ist
Code:
testausgabe: 75/produkt0
i: 0, 75/produkt0
i: 1, 76/produkt1
i: 2, 77/produkt2
i: 3, 78/produkt3
ich will gar nicht groß vorhersehen, was bei dir passiert, wenn du es irgendwie zum Laufen bringst wären neue Logs interessant,

evtl. reicht irgendwann nicht nur der String testausgabe, sondern es wären auch Log-Ausgaben im SubscriptionData- + IdString-Konstruktor interessant, vielleicht auch in der setProdukt-Methode,
du könntest testausgabe temporär zu einer statischen Variable in einer allgemein bekannten Klasse machen, so dass jeder dort reinschreiben kann,
Thread-Probleme wird es im Moment ja hoffentlich nicht auch noch geben
 
Zuletzt bearbeitet von einem Moderator:
@Guardi: Stimmt. Berechtigte Frage. Hab ich raus genommen und nun ist es wieder normal (ArrayList mit 6 Einträgen und 6 mal produkt5)
Wie das da hinkommt, gute Frage. Hab wohl einmal zu viel Strg Z bzw. zu viel Kommentare drin gehabt. Ich sollte wirklich für heute Schluss machen und morgen mir den Schmarn, den ich programmiert hab, noch mal anschauen.
Seltsam nur, wenn ich das so mit einer dataTable im JSP ausgeben lasse, wurden die NULL Elemente rausgenommen.

@SlaterB:
hab noch mal vorsichtshalber nachgeschaut, aber in der SubscriptionData Klasse sind die Parameter "nicht" statisch. Hätt mich zwar gewundert, warum ich sowas machen sollte, aber man weiß ja nie. Und da ich Eclipse benutz, würde sich das ja bemerkbar machen, falls doch. Und das hätte ich nach Stunden der Problemsuche ja schon gefunden 😉

Das mit der Länge 12 und den NULL Einträgen hat sich geklärt. Hab wohl aus Versehen einmal // zu viel entfernt, warum das bei den anderen Beispielen dann aber nicht auch passiert ist, weiß ich nicht...

Danke für die gedulige Hilfe von euch allen! Werd morgen noch mal über mein Programm schauen und weitere Fortschritte und hoffentlich Lösungen posten. Ich mach nun aber Feierabend, mir schwirrt einfach nur noch der Kopf und hätt eh in knapp ner halben Stunde Schluss 😉
 
Das ist doch alles nur noch gerate... und es werden immer Fehlerquellen, Dein Problem wird sich nicht vereinfachen. Vereinfache Deine Methode (Code extrahieren, andere Methoden daraus machen etc.). Schreib Dir einen Unit-Test und teste die verschiedenen Bereiche mit festen Daten. Teste auch die Klasse SubscriptionData und füge nicht null an, was bei einem Unit schon längst aufgefallen wäre... Teste auch das Teil, mit dem Du die Produktinformationen parst.
 
Ja ok aber da scheiterts an was anderem als Unit-Tests.
Objekte in einer Schleife erzeugen und diverse Member-Variablen anhand des Schleifen-Index zu setzen ist Java-Grundkurs. Da kann man im Prinzip nicht so hart viel falsch machen.
Warum fängst du eigentlich gleich mit Themen wie WebService an? Meiner Meinung nach fehlen da noch einige Basics. Glaub mir du machst dir das Leben wesentlich einfacher diese zu erlnen als ad-hoc jetzt schon Enterprise Apps entwickeln zu wollen.
 
ich glaub nicht, das er sich das freiwillig ausgesucht hat 😉

Aber egal, trotzdem helfen die Tests, z.B. bei der Methode, die die Informationen parst und daraus ein SubscriptionData macht, die kann ja sonst was zurückliefern. Wenn das nicht getestet ist, ist alles andere nur noch gerate. Die Beispiele nützen ihm auch nix, wenn in Wirklichkeit ganz andere Methoden genutzt werden, und das ist halt leider nur mit Tests sicherstellen.
 
@fastjack: stimmt, die Aufgabe habe ich zugeteilt bekommen 😉

So, zu meinem Stand:
nach vielem Ärger, Frust und grauen Haaren funktioniert die Werteübergabe nun.

Der Grund ist nicht ganz klar, irgendwo schien in den Projekteinstellungen wohl ein Fehler gewesen zu sein. Mir ist nur schleierhaft wo und warum.
Hab ein neues Projekt erstellt und alles nach einander hinzugefügt. Nichts geändert, alles beibehalten und immer nur copy and paste.
Und es hat nach dem dritten Anlauf funktioniert (nach extremer Staffelung der kopierten Einzelheiten). Hatte schon über ne Neuinstallation von Eclipse und allem nachgedacht, aber da bin ich drumrum gekommen. Zumindest im Moment... Eigentlich wurde der PC erst vor zwei Wochen neu aufgesetzt...

Den gestrigen Tag hab ich mit zig Tests zugebracht, dessen Ergebnisse mit der Zeit immer abstruser wurden, so dass ich die Befürchtung hatte, dass der PC von nem Virus geplagt wird. Hat sich bisher aber nicht bestätigt.

Ich hab keine Ahnung, was los war, und da der Fehler nun nicht mehr reproduzierbar ist (selbst mein altes Projekt funktioniert nun plötzlich), verbuche ich das Problem unter "Heinzelmännchenbefall" und hoffe, dass die mich so schnell nicht wieder heimsuchen.

Danke jedenfalls an alle, die mir geholfen haben! 🙂
 

Neue Themen


Zurück
Oben