Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
um es kurz zu machen, in einer Klasse Produkt sind 3 Konstruktoren für name nummer und preis eines Produkts in der Klasse Produktverwaltung werden in der ersten Methode 6 Objekte von "Produkt" erzeugt mit 3 Attributen, in der Methode dannach sollen diese nun serialisiert werden, wie komme ich an die Objekte dort ran, wenn ich den namen ganz normal angebe erhalte ich einen fehler, dass er das Objekt nicht findet, wir greift man allgemein auf Objekte zu?
Ich muss die vorher schon deklarieren "Produkt product;" reicht, ich wusste nur nicht wie ich die allgemein vorher deklariere, natürlich war das wiedermal sehr leicht... Danke
Ich denke ich muss (da das die bisher größte Übung ist) noch ein zwei Fragen stellen, deshalb auch der unspezifische Titel.
in dem Online-Handel sollen Produkte als Objekte erzeugt werden in der Klasse Produktverwaltung werden diese eben erzeugt und sollen am Ende in einer Arraylist gespeichert werden, ich denke das hat auch geklappt, wie kann ich denn weiter nun darauf zugreifen?
In der Maindatei soll nämlich bei passender Eingabe (Menüabfrage) eine Auflistung der Produkte erfolgen, also so etwas:
Wie setze ich das am geschicktesten um? Benötige ich eine ToString Methode, wenn ja wo? weil so wie bisher gibt er mir garnichts aus (was zu erwarten war).
import java.util.*;
class OnlineShop
{
public static void main (String args[])
{
Produktverwaltung d = new Produktverwaltung();
OnlineShop c = new OnlineShop();
int b = c.ZeigeHauptmenue();
switch (b)
{
case 1:
ListIterator<String> it = d.produktliste.listIterator();
while (it.hasNext())
{
System.out.println(it.next());
}
break;
}
}
public int ZeigeHauptmenue()
{
TastaturIn a = new TastaturIn();
int b;
System.out.println("Online-Shop Wunschshop");
System.out.println("-----------------------------");
System.out.println("1 - Produkte anzeigen");
System.out.println("2 - Bestellung aufgeben");
System.out.println("3 - Bestellung abschicken");
System.out.println("0 - Programm beenden");
System.out.println("Bitte Ihre Auswahl eingeben und bestaetigen.");
do
{
try
{
b = a.readInt();
break;
}
catch (Exception e)
{ System.out.println("Fehler! Bitte eine der angegebenen Zahlen auswählen und bestaetigen."); }
}
while (true);
return b;
}
}
Ich bin für jede Hilfe dankbar.
Beste Grüße
ps: Damit es vielleicht schneller geht, in der Datei Produktverwaltung wird noch serialisiert, das sollte auch klappen (oder auch nicht) und ab Zeile 90 wird dann in die Arraylist geschrieben
In der Maindatei Zeile 21 case 1 fängt den Fall ab, dass die Produkte angezeigt werden sollen, dort soll die Auflistung hinein.
Ohne jetzt genau den Code zu betrachten allgemein so:
Java:
int alpha = arrl.size(); //nicht -1 auf grund der while schleife
int index = 0;
while(alpha>0) {
System.out.println("" + arrl.get(index).getName() + arrl.get(index).getPreis());
alpha--;
index++;
}
system.out.println(); Ruft jedes Mal die toString Methode auf. Falls du keine eigene geschrieben hast, wird es normalerweise die Standart toString Methode nutzen und gibt dir aber trotzdem den String, der das Objekt repräsentiert: 325314@Produkt... bla. (allerdings keine schöne Ausgabe).
Schreibe mal vielleicht eine eigene StringFormat Methode... die etwa sowas macht:
Java:
public String stringFormat (int index, String currentString, int price){
return index + " " + currentString + ", " + price;
}
Du kannst den Index des Objekts erfahren, indem du die Liste benutzt und darauf "liste.indexOf(currentString)" aufrufst. Den String selber bekommst du durch "it.next().getName()" (oder wie du es implementiert hast eben). Und den price über it.next().getPrice()... wäre zumindest naheliegend.
Aja noch was, dein Iterator ist so nicht ganz richtig!
Ersetze:
Java:
ListIterator<String> = ...
durch:
Java:
ListIterator<Produkt> = ...
dann kannst du gleich durch das Produkt-Objekt iterieren, und so, wie ich es oben geschrieben habe auf die einzelenen Werte (.getName(), .getPrice(), List.IndexOf(ProduktObjekt.getName())) zugreifen.
Dann benötige ich zwingend diese Stringmethode oder?
Bspw. kennt er atm "currentString" nicht, wo schreibe ich die Stringmethode am Besten rein und woher bekommt sie die Werte index currentString und price?
[EDIT]Habe sie im Moment in der Produktverwaltung.java nämlich dort wo die Objekte erzeugt werden sollen[/EDIT]
Also muss ich sie von irgendwo aufrufen aber von wo?
Das mit der Ausgabe habe ich implementiert:
Java:
case 1:
ListIterator<Produkt> it = d.produktliste.listIterator();
System.out.println(liste.indexOf(currentString)+ " "+ it.next().getproduktname() + " " + it.next().getpreis());
break;
Im Moment schmeißt er mir eben noch:
OnlineShop.java:29: cannot find symbol
symbol : variable currentString
location: class OnlineShop
System.out.println(d.produktliste.indexOf(curren
tString)+ " "+ it.next().getproduktname() + " " + it.next().getpreis());
^
Wenn du ein Objekt von Produkt (ganz am Anfang) erstellst, dann übergibst du im Konstruktor Strings... Namen, wie "Suedwein", "EdelBurgunder". Diese Werden ja hoffentlich auch gespeicher in der Klasse "Produkt.java".
Wenn du nun ein Objekt hast von Produkt, dann solltest du auch auf den Namen zugreifen können.
Nochmal zu Erinnerung: In deinem Fall ist dein "aktuelles" Produkt-Objekt realisiert durch "it.next()"... auch wenn man das nicht sofort sieht^^
Also musst du irgendwie über it.next().getName()... auf diesen String zugreifen, den du beim Initialiseren in den Konstruktor geschrieben hast. (Falls eine solche Methode "getName()" noch nicht in Produkt.java implementiert ist, solltest du dies dringend nachholen!)
-- wenn du das dann hast, dann kannst du it.next().getName() anstatt "currentString" ersetzen. --
P.S.:
Wenn du dein System.out.Println schon SO implementierst, brauchst du keine Extra-Methode "StringFormat" oder "toString()"... dann klappt das auch so.
Ich verstehe irgendwie das Problem nicht.
Deine Klasse Produkt hat unrelevant viele Attribute. Angenommen Name und Preis, beides Strings
Java:
public class Produkt {
private String name;
private String preis;
public Produkt(String name, String preis) {
this.name = name;
this.preis = preis;
}
}
Jetzt willst du auf die Attribute zugreifen, die allerdings private sind und somit nur für die eigene Klasse zugänglich.
Java:
public class Produkt {
private String name;
private String preis;
public Produkt(String name, String preis) {
this.name = name;
this.preis = preis;
}
public String getName() {
return name;
}
public String getPreis() {
return preis();
}
}
So jetzt kannst du schonmal ohne Probleme auf das zugreifen, was du ausgeben willst.
Jetzt hast du einen ArrayList in der du die Produkte speicherst
Java:
ArrayList<Produkt> arrl = new ArrayList<Produkt>();
public void hinzufuegen(Produkt p) {
this.arrl.add(p);
}
Jetzt kannst du schonmal so viele Produkte hinzufügen, wie du willst .
Um dir diese, so wie ich es verstanden habe, in der Konsole ausgeben zu lassen, wie schon oben beschrieben:
Java:
int alpha = arrl.size();
int index = 0;
while(alpha>0) {
System.out.println("" + arrl.get(index).getName() + arrl.get(index).getPreis());
alpha--;
index++;
}
Oder habe ich dein Vorhaben nicht ganz verstanden?
woran könnte das liegen? Bevor ich versucht habe die Produkte auszugeben hat das keine Probleme bereitet.
Java:
import java.util.*;
class OnlineShop
{
Produkt y = new Produkt();
public static void main (String args[])
{
Produktverwaltung d = new Produktverwaltung();
OnlineShop c = new OnlineShop();
int b = c.ZeigeHauptmenue();
switch (b)
{
case 1:
ListIterator<Produkt> it = d.produktliste.listIterator();
System.out.println(d.produktliste.indexOf(it.next().getproduktname())+ " "+ it.next().getproduktname() + " " + it.next().getpreis());
break;
}
}
public int ZeigeHauptmenue()
{
TastaturIn a = new TastaturIn();
int b;
System.out.println("Online-Shop Wunschshop");
System.out.println("-----------------------------");
System.out.println("1 - Produkte anzeigen");
System.out.println("2 - Bestellung aufgeben");
System.out.println("3 - Bestellung abschicken");
System.out.println("0 - Programm beenden");
System.out.println("Bitte Ihre Auswahl eingeben und bestaetigen.");
do
{
try
{
b = a.readInt();
break;
}
catch (Exception e)
{ System.out.println("Fehler! Bitte eine der angegebenen Zahlen auswählen und bestaetigen."); }
}
while (true);
return b;
}
}
[EDIT]ps: mit while schleife wie zu Beginn selbes Resultat -> keine Ausgabe (falls relevant)[/EDIT]
Ah sry, haber selber noch einen denkfehler mit drin, ich arbeit selte mit "Iteratoren"
jedes Mal wenn du it.next() aufrufst kommt das "nächste" objekt in der Liste... deswegen schreibe einmal in der schleife (eine zeile vor dem system.out.println()) Produkt currentProdukt = it.next();
Und dann ersetze currentProdukt durch jedes it.next(). im Print-Befehl.
import java.util.*;
class OnlineShop
{
public static void main (String args[])
{
Produktverwaltung d = new Produktverwaltung();
OnlineShop c = new OnlineShop();
int b = c.ZeigeHauptmenue();
switch (b)
{
case 1:
ListIterator<Produkt> it = d.produktliste.listIterator();
System.out.println(d.produktliste + " "+ it.next().getproduktname() + " " + it.next().getpreis());
break;
}
}
public int ZeigeHauptmenue()
{
TastaturIn a = new TastaturIn();
int b;
System.out.println("Online-Shop Wunschshop");
System.out.println("-----------------------------");
System.out.println("1 - Produkte anzeigen");
System.out.println("2 - Bestellung aufgeben");
System.out.println("3 - Bestellung abschicken");
System.out.println("0 - Programm beenden");
System.out.println("Bitte Ihre Auswahl eingeben und bestaetigen.");
do
{
try
{
b = a.readInt();
break;
}
catch (Exception e)
{ System.out.println("Fehler! Bitte eine der angegebenen Zahlen auswählen und bestaetigen."); }
}
while (true);
return b;
}
}
import java.util.*;
class OnlineShop
{
public static void main (String args[])
{
Produktverwaltung d = new Produktverwaltung();
OnlineShop c = new OnlineShop();
int b = c.ZeigeHauptmenue();
switch (b)
{
case 1:
ListIterator<Produkt> it = d.produktliste.listIterator();
while (it.hasNext())
{
Produkt currentProdukt = it.next();
System.out.println(d.produktliste.indexOf(currentProdukt.getproduktname())+ " "+ currentProdukt.getproduktname() + " " + currentProdukt.getpreis());
}
break;
}
}
public int ZeigeHauptmenue()
{
TastaturIn a = new TastaturIn();
int b;
System.out.println("Online-Shop Wunschshop");
System.out.println("-----------------------------");
System.out.println("1 - Produkte anzeigen");
System.out.println("2 - Bestellung aufgeben");
System.out.println("3 - Bestellung abschicken");
System.out.println("0 - Programm beenden");
System.out.println("Bitte Ihre Auswahl eingeben und bestaetigen.");
do
{
try
{
b = a.readInt();
break;
}
catch (Exception e)
{ System.out.println("Fehler! Bitte eine der angegebenen Zahlen auswählen und bestaetigen."); }
}
while (true);
return b;
}
}
Falls nein wie meintest du es dann?
Falls Ja, immernoch keine Ausgabe der Produkte. :-(
Ahso, sorry ich schreibe alles im Windowseditor (ich hab schon genug Kommentare dazu gehört) und da sind die Lücken nicht so groß wie in dem Forum, da fällt mir eine leere Zeile zu viel nicht direkt auf.
Dein Fehler ist, dass deine Liste, die du an der Stelle d.ProduktListe.iterator()... aufrufst leer ist.
Die While-Schleife wird also sofort mit der Bedingung it.hasNext() false! (Kein Schleifendurchlauf).
Du rufst von deiner Main-Methode aus, nie die Stellen auf, an denen du Produkte in die Produktliste aus "Produktverwaltung" hinzufügst... Also im Prinzip sind die Methoden aus "Produktverwaltung.java" nie ausgeführer Code
Du kannst dies beheben, in dem du in der Main Methode das ganze machst (also Produkte erstellen und einer Liste hinzufügen), oder du machst von der Main-Methode aus verweise auf Methoden in der Produktverwaltung, mit Hilfe eined "Produktverwaltungsobjektes" wie du eins schon erstellt hast.
Es fehlern im Prinzip bei dir die Zeilen:
Java:
d.Produkte(); // erstellt Produkte im Objekt... besserer Name wäre: "erstelleProdukte()"
d.produktliste.add(d.suedwein);
d.produktliste.add(d.erdamer);
... usw. // siehe auch den Post von Julian.veh. Er macht das mit dem Serialisieren auch noch. Ist besser.
In der Klasse Online-Shop nachdem du das Produktverwaltungsobjekt "d" erstellt hast.
Nach Aufgabenstellung sollte ich in Produktverwaltung eine Methode schreiben die die Objekte seriealisiert und in eine Arraylist speichert, deswegen hatte ich das so geschrieben.
muss ich also erst Produkte() dann Serialisieren() und dann Reserialisieren aufrufen?
Bei deinem angebotenem Code sieht es so aus als würde von der Mainmethode aus in die Liste gespeichert oder was wird dort gemacht? Weil das soll ja in Produktverwaltung geschehen.
@julian.veh
Ich habe das mal gemacht, allerdings benötige ich doch eine String methode die das überschreibt oder, weil so implementiert ergibt das Käse (also die Darstellung), lustigerweise gibt er suedwein 129.99 aus.
Außerdem werden 4 Fehler beim Serialisieren geschmissen, fehlen dann nicht automatisch Objekte in der Liste die ja nicht wieder zurückgeholt werden ich verstehe auch nicht wo der Fehler beim Serialisieren liegt... Das ist ein Code den ich vor ein paar Tagen shconmal benutzt habe, dort habe ich genauso serialisiert und es klappte..
Natürlich ist das logisch aber trotzdem Käse siehe oben "Die Darstellung" (also das: Produkt@15cda3f) weil das was ich brauche ist ja nun etwas anderes...
Habe deins ausporbiert, beim Serialisieren gibt es weiterhin einen Fehler entsprechend wird der suedwein nicht ausgegeben und dieses "Produkt@15cda3f" steht weiterhin (zusätzlich) dort und muss natürlich weg, stattdessen wird 0 1 usw. benötigt, kann ich nicht den Index des Array dort ausgeben.
Außerdem wird schon wieder eine Exception geschmissen:
Exception in thread "main" java.util.NoSuchElementException
at java.util.ArrayList$Itr.next(Unknown Source)
at OnlineShop.main(OnlineShop.java:33)
Also ist das eine ArrayList. Sorry ich habe von ListIterator noch nichts gehört. Warum machst dus nicht einfach so wie ich schon auf seite 1 beschrieben habe? Das sollte doch funktionieren.
Du hast eine Arraylist, guckst wie viele objekte darin gespeichert wurden, speicherst die zahl als zB alpha. Dann rufst du in einer schleife so lange das objekt des index i auf,
Code:
while(i<alpha)
, wobei i beim start der schleife 0 ist und nach jedem schleifendruchlauf um 1 addiert wird.
Weil wir ListItteratoren benutzen, die Antwort klingt doof aber ich muss das halt können (es ist zwar hier nicht explizit gefordert) aber das andere hatten wir so nicht, ich kann es ja mal ausprobieren.
Aber nochmal die Frage, Fehler beim Serialisieren, irgendeine Idee? denn er schmeißt mir einen Fehler beim Serialisieren und einen beim ReSerialisieren.
Den Suedwein habe ich mittlerweile erhalten, weil wenn ich vorherit.next() sage springt er zum zweiten Objekt, ich habs also mal hinten rangeschoben, da ich ja nun keine andere Möglichkeit habe probiere ich mal deinen ersten Ansatz...