Ausgabe aus Arraylist erzeugt Exceptionfehler

Underfaker

Bekanntes Mitglied
Hallo,

im Laufe eines Programms erzeuge ich verschiedene Objekte, relativ zum Schluss werden ein paar Attribute an eine Methode übergeben, die diese in eine Arraylist speichern soll (Übergeben werden diese auch korrekt).
Wenn ich dann aber versuche die Elemente aus der Arraylist auszugeben bekomme ich einen (ich denke bekannten) Exceptionfehler:

Exception in thread "main" java.util.NoSuchElementException
at java.util.ArrayList$Itr.next(Unknown Source)
at Bestellung.bestellungausgeben(Bestellung.java:43)
at OnlineShop.mainersatz(OnlineShop.java:93)
at OnlineShop.produktebestellen(OnlineShop.java:351)
at OnlineShop.bestellen(OnlineShop.java:214)
at OnlineShop.mainersatz(OnlineShop.java:85)
at OnlineShop.main(OnlineShop.java:59)

Die Methode der Ausgabe sieht so aus:


Das mit dem einfachen next habe ich einfach probiert weil ich weiß wie viele Elemente in der Liste sein müssen, könnte das schon ein Problem sein?

Code siehe unten


(( In Zeile 245 wird auf die Methode Bestelldaten zugegriffen und ab 272 ist die Methode die die Einträge ausgeben soll. ))

ps: Wegen der Form und Konvention, ja sorry, nachdem ich zwischendurch schon aufgegeben hatte habe ich rumgebastelt daher resultieren (Stand jetzt) noch viele Schönheitsfehler


Ich würde mich freuen, wenn mir jemand hierbei helfen könnte

Beste Grüße 🙂
 
Zuletzt bearbeitet:
Die Exception sagt einfach aus, dass keine weiteren Elemente mehr in der Liste vorhanden sind!


Java:
        Bestellung y = new Bestellung();
 
        ListIterator ut = y.bestelldaten.listIterator();
 
        System.out.println("Die Bestellung von "+ ut.next() + ", " + ut.next() +  " für " + ut.next() + " EUR wurde an die " + ut.next() + ", " +  ", " +  ut.next() + " geliefert.");

Du rufst ja auch einfach ut.next() auf, ohne zu schauen obs noch weitere Elemente gibt.
Der Fehler wird auch sein, dass du ein neues Bestellungs-Objekt erstellst, kein Wunder dass dann da keine Elemente in der Liste sind, denn auf diesem Objekt wird ja nie die Methode Bestelldaten aufgerufen (Methoden schreibt man vorne klein!)
 
Ja das habe ich doch alles erklärt.

Wie kann ich das denn umsetzen, dass er die Daten in der Liste behält, muss ich das Objekt benutzen mit dem ich auch ursprünglich die Bestelldatenmethode aufgerufen habe?
 
underfaker hat gesagt.:
muss ich das Objekt benutzen mit dem ich auch ursprünglich die Bestelldatenmethode aufgerufen habe
Ja, genau. Die Daten sind ja in dem Objekt gespeichert. Bei der Klasse Bestellung ist es übrigens unnötig
von ArrayList zu erben. Du benutzt ja eine ArrayList als Klassenvariable.
 
index3, v, y, f, lol, gamma, haha, ...
Dein Programm ist unglaublich mühsam zu lesen. Wieso sollten sich andere da durchkämpfen, wenn dir selbst die Lust fehlt, hier irgendetwas zu verbessern?

In der Methode
Code:
produktebestellen
wird offensichtlich dein
Code:
Bestellung v
mit Informationen gefüllt. Dann solltest du in
Code:
abschicken
doch auch wieder auf v zugreifen und nicht ein neues
Code:
Bestellung y
erstellen. Du könntest
Code:
Bestellung v
beispielsweise als Instanzvariable definieren, dann kannst du in allen Methoden darauf zugreifen.
Dessen ungeachtet könntest du mit hasNext() überprüfen, ob der Iterator überhaupt ein next hat und so die Exception verhindern.
 
Zuletzt bearbeitet:
Das habe ich jetzt gemacht, also ich habe

Java:
Bestellung v = new Bestellung();

ganz oben in die klasse geschrieben und benutze dieses v um die Daten zu übergeben und um die Daten wieder aufzurufen allerdings bleibt der Fehler bestehen, e sgibt jedoch kein weiteres Objekt, dass auf die Klasse Bestellung zugreift, woran könnte es sonst noch liegen?
 
Habe den Code mal einbisschen modifiziert, ich hatte es zwar schon gesagt aber es ist verständlich.

main:
Java:
import java.util.*;
import java.io.*;

class OnlineShop

{

		private InputStreamReader is=new InputStreamReader(System.in);
		private BufferedReader faileingabe=new BufferedReader(is);

	int kundenid;
	int kundenidreturn;
	int produktnr;
	int bestellmenge;
	double gesamtpreis;

	Bestellung bestellungsabwicklungsobjekt = new Bestellung();

	Produktverwaltung produktverwaltungsobjekt = new Produktverwaltung();	

	public static void main (String args[])

	{


		OnlineShop onlineshopobjekt = new OnlineShop();

		/* 	

		int b = OnlineShop.ZeigeHauptmenue();

		switch (b)

		{

			case 1: 

				onlineshopobjekt.produkteaufrufen();

			break;

			case 2:

				onlineshopobjekt.bestellen();

			break;

			case 3:

				onlineshopobjekt.abschicken();

				

			break;

			default:

			break;

		} */

		onlineshopobjekt.mainersatz();

	}

	public static void mainersatz()

	{

			OnlineShop onlineshopobjekt = new OnlineShop();

			

		int b = OnlineShop.ZeigeHauptmenue();

		switch (b)

		{

			case 1: 

				onlineshopobjekt.produkteaufrufen();

			break;

			case 2:

				onlineshopobjekt.bestellen();

			break;

			case 3:

				onlineshopobjekt.abschicken();
	
			break;

			default:

			break;

		}

	}

	public static int ZeigeHauptmenue()

	{

		TastaturIn eingabe4 = 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 = eingabe4.readInt();

				if ( b == 0 || b ==1 || b == 2 || b == 3)
				
				break;

				else

				System.out.println("Fehler! Bitte eine der angegebenen Zahlen eingeben und Enter drücken.");

			}

			catch (Exception e)

			{ System.out.println("Fehler! Bitte eine der angegebenen Zahlen auswählen und bestaetigen."); }

		}

		while (true);

		return b;

	}

	public void produkteaufrufen()

	{

		System.out.println("---Produktliste---");
	
		int listenlaenge1 = produktverwaltungsobjekt.produktliste.size();

		int index = 0;

		while(listenlaenge1>0) 

			{

				System.out.println(index + "  " + produktverwaltungsobjekt.produktliste.get(index).getproduktname() + ", " +  produktverwaltungsobjekt.produktliste.get(index).getpreis());

				listenlaenge1--;
				
				index++;

			}

		



		try
	
			{

				System.out.println("Drücken Sie Enter um zum Menue zurück zu kehren.");

				String zeile="";
		
				zeile= faileingabe.readLine();


			}

			catch (Exception e)

			{ System.out.println("Fehler!"); }

		OnlineShop.mainersatz();

	}

	public void bestellen()

	{

		kundenidreturn = waehlekundennummer();

		produktebestellen();

	}

	public int waehlekundennummer()

	{

		Kundenverwaltung e = new Kundenverwaltung();

		TastaturIn eingabe3 = new TastaturIn();

		

		ListIterator<Kunde> ot = e.kundenliste.listIterator();

		int listenlaenge2 = e.kundenliste.size();

		int index2 = 0;

		System.out.println("---Kundenliste---");

		while(listenlaenge2>0) 

		{

			System.out.println(index2 + "  " + e.kundenliste.get(index2).getKundenname() + ", " +  e.kundenliste.get(index2).getStraße() + ", " +  e.kundenliste.get(index2).getOrt());

			listenlaenge2--;
				
			index2++;

		}

		System.out.println("Bitte geben Sie Ihre Kundennummer ein und drücken Sie Enter.");

		do

		{

			try
	
			{

				kundenid = eingabe3.readInt();
				
				break;

			}

			catch (Exception u)

			{ System.out.println("Fehler! Bitte eine der angegebenen Zahlen auswählen und bestaetigen."); }

		}

		while (true);

		return kundenid;

	}

	public void abschicken()

	{
	
		// Bestellung v = new Bestellung();

		ListIterator ut = bestellungsabwicklungsobjekt.bestelldaten.listIterator();

		System.out.println("Die Bestellung von "+ ut.next() + ", " + ut.next() +  " für " + ut.next() + " EUR wurde an die " + ut.next() + ", " +  ", " +  ut.next() + " geliefert.");

	}

	public void produktebestellen()
	
	{

		System.out.println("---Produktliste---");

		Kundenverwaltung e = new Kundenverwaltung();

		// Bestellung v = new Bestellung();

		TastaturIn eingabe2 = new TastaturIn();

		int listenlaenge3 = produktverwaltungsobjekt.produktliste.size();

		int index3 = 0;

		while(listenlaenge3>0) 

			{

				System.out.println(index3 + "  " + produktverwaltungsobjekt.produktliste.get(index3).getproduktname() + ", " +  produktverwaltungsobjekt.produktliste.get(index3).getpreis());

				listenlaenge3--;
				
				index3++;

			}

		

		do

		{

		try
	
			{

				System.out.println("Geben Sie die Produktnummer ein:");
		
				produktnr = eingabe2.readInt();

				System.out.println("Geben Sie die Bestellmenge ein:");

				bestellmenge = eingabe2.readInt();
				
				break;

			}

			catch (Exception p)

			{ System.out.println("Fehler!"); }

		}

		while(true);

		gesamtpreis = bestellungsabwicklungsobjekt.gesamtpreisberechnen(produktverwaltungsobjekt.produktliste.get(produktnr).getpreis(), bestellmenge);

		bestellungsabwicklungsobjekt.bestelldatenspeichern(e.kundenliste.get(kundenidreturn).getKundenname(), produktverwaltungsobjekt.produktliste.get(produktnr).getproduktname(), gesamtpreis, e.kundenliste.get(kundenidreturn).getStraße(), e.kundenliste.get(kundenidreturn).getOrt());

		OnlineShop.mainersatz();

	}

}

Bestellung:
Java:
import java.util.*;

class Bestellung

{

	ArrayList bestelldaten = new ArrayList();

	double gesamtpreis;

	public double gesamtpreisberechnen(double preis, int menge)

	{

		gesamtpreis = preis * menge;

		return gesamtpreis;

	}

	public void bestelldatenspeichern(String kundenname, String produktname, double gesamtpreis,  String straße, String ort)

	{

		bestelldaten.add(kundenname);

		bestelldaten.add(produktname);

		bestelldaten.add(gesamtpreis);

		bestelldaten.add(straße);

		bestelldaten.add(ort);

	}

}

In Zeile 347 wird die Methode zur Speicherung aufgerufen und in 281/283 soll sie ausgegeben werden.
 
Zuletzt bearbeitet:
Dein
Code:
bestellungsabwicklungsobjekt
, in dem sich die Bestellinformationen befinden, wird, nachdem du es befüllt hast, in deiner mainersatz-Methode mit folgender Zeile wieder zerstört:
Java:
OnlineShop onlineshopobjekt = new OnlineShop();
 
Ich brauche aber dieses onlineshopobjekt um auf die Methoden in der Klasse Onlineshop zugreifen zu können, leider muss ich aber auch das Menü über diese Methode wieder aufrufen.

Also das Menü sieht so aus:

Online-Shop Wunschshop
-----------------------------
1 - Produkte anzeigen
2 - Bestellung aufgeben
3 - Bestellung abschicken
0 - Programm beenden

Nachdem man 2 ausgewählt hat wird die Bestellung gespeichert und dann muss man wieder ins Menü und soll dann neu wählen und wenn man die 3 wählt sollen eben die Bestelldaten ausgegeben werden.

Also muss ich ja wieder dorthin zurück deshalb rufe ich diese auf aber ohne das onlineshopobjekt gelange ich nciht zu den weiteren Methoden, wie kann ich das irgendwie umgehen oder geht das garnicht und ich kann dann einen Haken dran machen?
 
Aber so wie du es gelöst hast, wird bei jedem Aufruf deines Menüs ein neuer OnlineShop erzeugt. Wenn nun jemand zuerst "Produkte anzeigen" wählt, dann "Bestellung aufgeben" und schließlich "Bestellung abschicken", hast du drei verschiedene OnlineShops erzeugt!

Eine Lösung wäre, du erstellst ein neues Objekt "OnlineShopDemo" mit:
Java:
public class OnlineShopDemo {
	public static void main(String[] args) {
		OnlineShop onlineshopobjekt = new OnlineShop();
		onlineshopobjekt.start();
	}
}
Dann entfernst du die statische Main-Methode aus OnlineShop und nennst deine mainersatz-Methode in start um. Jetzt ist das onlineshopobjekt im OnlineShop überflüssig.
 
Ok danke aber leider hilft mir das so nicht, denn dafür benötige ich eine neue Klasse und das darf ich nicht aber trotzdem danke. 🙂

Wie soll ich denn an die ganzen Sachen ran kommen ohne immer wieder einen neuen OnlineShop zu erzeugen..

Also im Prinzip darf: "OnlineShop onlineshopobjekt = new OnlineShop(); " nicht im mainersatz stehen, weil dann wird wieder alles auf 0 gesetzt was vorher war aber ohne geht es leider nicht weiter...

Falls es keine Lösung dazu geben sollte ist das auch ok man kann ja nicht alles haben.
 
Eine neue Klasse anzulegen, war nur ein Vorschlag von mir.
Ebenso gut kannst du die obige main-Methode in deine bestehende Klasse OnlineShop einbauen.
 
Also ich ersetze meine mainmethode durch deine, benenne "mainersatz" in "start" um und entferne überall onlineshopobjekt außer in der mainmethode?

[EDIT]

In dem Fall passiert aber genau das was ich verhindern wollte, dann sind nämlich alle möglichen anderen Methoden nicht mehr zugänglich...
C:\Users\Alex\Desktop>javac OnlineShop.java
OnlineShop.java:45: non-static method produkteaufrufen() cannot be referenced fr
om a static context
produkteaufrufen();
^
OnlineShop.java:52: non-static method bestellen() cannot be referenced from a st
atic context
bestellen();
^
OnlineShop.java:59: non-static method abschicken() cannot be referenced from a s
tatic context
abschicken();
^
OnlineShop.java:168: cannot find symbol
symbol : method test()
location: class OnlineShop
OnlineShop.test();
^
OnlineShop.java:314: cannot find symbol
symbol : method test()
location: class OnlineShop
OnlineShop.test();
^

Mit dem onlineshopobjekt vor den Methoden:
OnlineShop.java:44: cannot find symbol
symbol : variable onlineshopobjekt
location: class OnlineShop
onlineshopobjekt.produkteaufrufen();
^
OnlineShop.java:50: cannot find symbol
symbol : variable onlineshopobjekt
location: class OnlineShop
onlineshopobjekt.bestellen();
^
OnlineShop.java:56: cannot find symbol
symbol : variable onlineshopobjekt
location: class OnlineShop
onlineshopobjekt.abschicken();
^
OnlineShop.java:165: cannot find symbol
symbol : variable onlineshopobjekt
location: class OnlineShop
onlineshopobjekt.test();
^
OnlineShop.java:311: cannot find symbol
symbol : method test()
location: class OnlineShop
OnlineShop.test();
^
[/EDIT]
 
Zuletzt bearbeitet:

Zurück
Oben