Array in Endlosschleife überschreibt vorherige Werte

DarkwinDuck

Mitglied
Hallo Leute,

ich bin dabei ein kleines Übungsprogramm zu schreiben. Es sollen per Tastatureingabe Bücher in einer "Bibliothek" gespeichert werden. Hierfür sind jeweils Buch und Bibliothek als Klassen definiert.

Klasse Book
Java:
//Book.java
class Book {
	
	//Attribute der Klasse
	String autor;
	String titel;
	
	//Methoden der Klasse
	void setAutor (String a){
		autor = a;
	}
	void setTitel (String a){
		titel = a;

Klasse Library
Java:
 public class Library {

	//Attribute der Klasse
	Book [] Buecher = new Book [3];
	int buchEintraege = 0;
	int eintragsNummer;
	String liste;
	String neuerEintrag;
		
	//Methoden der Klasse
	void setBook (Book a){
			Buecher[buchEintraege] = a;
			System.out.println("Das Buch - " + Buecher[buchEintraege].titel + " - wurde erfolgreich angelegt!\n");
		    buchEintraege = buchEintraege + 1;
		}
	String getList (){
		liste = "";
		for (int i = 0; i < buchEintraege; i++){
			eintragsNummer = i + 1;
			neuerEintrag = (eintragsNummer + ".Eintrag: " + Buecher[i].titel + " von " + Buecher[i].autor); 
			liste = (liste +"\n" + neuerEintrag + "\n");		
		}
		return liste;

Wenn ich nun in meinem Hauptprogramm die verschiedene Bücher eingebe funktioniert soweit alles.

Wenn ich allerdings als letzten Schritt die Liste der Bücher aus der Bibliothek ausgeben lassen möchte, dann bekomme ich 3 mal das gleiche Buch genannt, und zwar das zuletzt eingegebene.

Hier der Code zum Hauptprogramm:
Java:
		//Attribute
		Book buch = new Book();
		int auswahl = 0;
		int buecherZahl = 0;
		String liste;
		Library bib1 = new Library();
		Scanner scanner = new Scanner(System.in);
		
		
		//Methoden
		//Begrüßungsformel
		System.out.println("Willkommen in der automatisierten Bibliothek!");
		
		//Switch-Case für Personeninteraktion
		while (true){
			if (auswahl == 0){ 		
				//Startwert 0 lässt Abfrage was passieren soll lassen
				System.out.println("Sie haben folgende Optionen: \n1. Ein neues Buch abspeichern. \n2. Die aktuelle Bibliotheksliste ausgeben lassen. \n3. Das Programm beenden. \n\nBitte geben Sie ihre Auswahl mit 1, 2 oder 3 an!");
				auswahl = scanner.nextInt (); continue;
			}
			if (auswahl == 1){ 
				//Prüfen ob Platz in der Bibliothek ist
				if (buecherZahl > 2) { 
					System.out.println("Die Bibliothek ist bereits voll!");
					auswahl = 0;
				}
				else {
				System.out.println("Bitte geben Sie den Autor des Buches an!");
				String temp = scanner.nextLine ();
				buch.setAutor(scanner.nextLine ());
				System.out.println("Bitte geben Sie den Titel des Buches an!");
				buch.setTitel(scanner.nextLine ());
				bib1.setBook(buch);
				//Setzt auf Startwert zurück um neue Abfrage zu erzwingen!
				auswahl = 0; buecherZahl = buecherZahl + 1; 
				} continue;
			}
			if (auswahl == 2){
				if (buecherZahl != 0){
				liste = bib1.getList();
				System.out.println(liste);
				auswahl = 0;	
				}
				else { System.out.println("Es sind noch keine Bücher in der Bibliothek enthalten!\n");
				auswahl = 0;
				}
				continue; 
			}	
			if (auswahl == 3){
				scanner.close();
				System.out.println("Das Programm wird beendet. \nVielen Dank für Ihren Besuch und auf Wiedersehen!");
				break;
			}
			if (auswahl > 3) System.out.println("Die Eingabe ist ungültig!\n"); auswahl = 0; continue;

Ich habe das ganze auch mal "hart" programmiert, sprich die Titel und Autoren der Bücher als feste Werte für drei fest angelegte Bücher festgelegt, und dann hat die Array Abspeicherung und Ausgabe problemlos funktioniert.

Bin leider völlig ratlos, woran es liegen könnte.
Vielen Dank für jede Hilfe.
 
Zuletzt bearbeitet:
Wenn du ein neues Buch in die Liste stellen willst, musst du vorher ein entsprechendes neues Buch-Objekt anlegen.
Du arbeitest derzeit immer am gleichen Buch-Objekt und fügst es nur mehrmals ein.
 
Danke Dompteur,

Du meinst, wenn ich den Wert von Buch im Hauptprogramm überschreibe, ändert sich der Wert auch automatisch in die Bibliothek?

Ich müsste also ebenfalls neue Objekte der Klasse Book anlegen, um die neuen Eingaben individuell abzuspeichern?!
 
Zuletzt bearbeitet:
Ja, genau das habe ich gemeint.
Es reicht, wenn du die Zeile 2
Java:
	Book buch = new Book();
ins Hauptprogramm vor Zeile 28 verschiebt.
Du brauchst dieses Buch-Objekt nämlich sonst nirgends im Hauptprogramm.
 
Perfekt! Danke!

Läuft problemlos auf diese Weise.

Hatte in der Zwischenzeit eine sehr unschöne und lange Switch-Case Abfrage gebastelt, aber so ist es wesentlich eleganter.
 

Zurück
Oben