String wird in Konsole nicht eingelesen

Feras

Aktives Mitglied
Hi, in der Zeile 67 habe ich das Problem, dass ich in der Konsole nach dem Ausführen nichts eingeben kann, obwohl der Befehl "input.nextLine()" da steht. Ich erhalte auch keine Fehlermeldungen.
Weiß jemand warum?

MfG Feras

Java:
import java.util.Scanner;

public class Receipt {

	private static String produktname;
	private static int menge;
	private static double preis;
	private static double gesamtpreis;

	public static void print() {

		String ausgabe = new String();

		System.out.println(ausgabe.toString());

	}

	public static double berechne(int menge, double preis) {

		gesamtpreis = menge * preis;

		return gesamtpreis;

	}

	public String toString() {

		StringBuilder sb = new StringBuilder();

		sb.append(produktname + "\n");
		sb.append(menge + "x\n");
		sb.append("\t\t" + gesamtpreis);

		return sb.toString();

	}

	public static void main(String[] args) {

		String speichern = new String();

		String fortsetzung = " ";

		Scanner input = new Scanner(System.in);

		System.out.println("--------------------------\n");
		System.out.println("      Kassenzettel\n\n");
		System.out.println("      Einkaufsliste\n");
		System.out.println("--------------------------\n");

		do {

			System.out.println("Welches Produkt möchten Sie kaufen? ");
			produktname = input.nextLine();

			System.out.println("Was für eine Menge wollen Sie kaufen? ");
			menge = input.nextInt();

			System.out.println("Wie teuer ist das Einzelprodukt? ");
			preis = input.nextDouble();

			berechne(menge, preis);
			speichern.toString();

			System.out
					.println("Geben Sie 'ja' ein, wenn Sie Ihren Einkauf fortsetzen möchten: ");
			fortsetzung = input.nextLine();

		} while (fortsetzung.equals("ja"));

		print();
	}
}
 
Füg zwischen Zeile 66 und 67 einfach
Java:
input.nextLine();
ein, dann sollte es funktionieren.

Mit freundlichen Grüßen
Xelsarion
 
Danke Xelsarion fuer die abermals schnelle Antwort.

Die print Methode habe ich erstellt, weil ich erst alles in der toString Methode zwischenspeichern will und dann alles am Ende ausgeben möchte. Mir war da nichts kürzeres eingefallen... :/


Edit: ich hattes gerade versucht mir selbst zu erklären, scheitere jedoch 😀
 
Zuletzt bearbeitet:
In dem Fall wird dir dieser Link eventuell behilflich sein 🙂 War gerade in der Uni und eigentlich schon am einpacken, deshalb die kurze Antwort, zudem gab es die letzte Woche gefühlt 10 Threads mit dem gleichen Problem.. u.a. hier 🙂

Mit freundlichen Grüßen
Xelsarion
 
Zuletzt bearbeitet:
Nachdem ich die Änderung jetzt durchgeführt habe, kann ich immer weiter Dinge eingeben, bis ich die do while Schleife zum Abbruch bringe. Nun soll eigentlich per print() Methode der zusammengebaute String aus der Methoden toString() ausgegeben werden. Ich erhalten jedoch dann keine Ausgabe, weiß wer warum?


MfG Feras
 
Nun soll eigentlich per print() Methode der zusammengebaute String aus der Methoden toString() ausgegeben werden

Ja einfach gesagt: Diese beiden Methoden print() bzw. toString() so sind "Käse".

Java:
	private static String produktname;
	private static int menge;
	private static double preis;
	private static double gesamtpreis;

	public static void print() {

		String ausgabe = new String();

		System.out.println(ausgabe.toString());

	}

	public String toString() {

		StringBuilder sb = new StringBuilder();

		sb.append(produktname + "\n");
		sb.append(menge + "x\n");
		sb.append("\t\t" + gesamtpreis);

		return sb.toString();

	}

	public static void main(String[] args) {
..........
		print();
	}
}

Deine "print()" Methode erzeugt einen neuen leeren String und diesen gibst du auf der Konsole aus.
Deine Methode "toString()" erzeugt einen StringBuilder und gibt als Ergebnis diesen zusammen gebauten String zurück, aber diese Methode wird von nirgends aufgerufen.

Die Methode "toString()" ist außerdem nicht statisch, sprich damit du diese Methode ausführen kannst brauchst du ein Objekt der Klasse in der diese Methode steht.
Wenn du diese Objekt erzeugt hast wäre folgender Aufruf möglich:

Java:
System.out.println(deinObjekt.toString())
 
also hier ist jetzt die main mit der Objekterzeugung

Java:
	public static void main(String[] args) {

		String speichern = new String();
		String ausgabe = new String();

		String fortsetzung = " ";

		Scanner input = new Scanner(System.in);

		System.out.println("--------------------------\n");
		System.out.println("      Kassenzettel\n\n");
		System.out.println("      Einkaufsliste\n");
		System.out.println("--------------------------\n");

		do {

			System.out.println("Welches Produkt möchten Sie kaufen? ");
			produktname = input.nextLine();

			System.out.println("Was für eine Menge wollen Sie kaufen? ");
			menge = input.nextInt();

			System.out.println("Wie teuer ist das Einzelprodukt? ");
			preis = input.nextDouble();

			berechne(menge, preis);
			speichern.toString();

			System.out
					.println("Geben Sie 'ja' ein, wenn Sie Ihren Einkauf fortsetzen möchten: ");
			input.nextLine();
			fortsetzung = input.nextLine();

		} while (fortsetzung.equals("ja"));

		System.out.println(ausgabe.toString());
	}
 
Deine Methoden sind wirklich nicht sehr schön. Ich würde dir raten, erst einmal prozedural zu programmieren (machst du ja momentan schon), also von "oben nach unten", und erst danach, wenn du die Grundlagen verstanden hast, OOP (Objektorientierte Programmierung) zu benutzen. Du kannst zwar wenn du willst, Methoden implementieren, aber sie sollten Sinn machen.

String speichern = new String();
String ausgabe = new String();

Hier erzeugst du zwar ein neues "Objekt" aber es ist vom Typ String. In OOP würde das Sinn machen, wenn es vom Typ Haus wäre und es davon mehrere geben würde. Aber mir erschließt es sich nicht ganz warum du vom String einen neues Objekt erzeugst, habe auch deinen Code nur überflogen.

Ein kleiner Tipp meiner Meinung nach wäre es, wenn du anstatt das oben genannte Zitat lieber, (nehmen wir an du hast eine Klasse Haus), deine Variablen Zugriffseinschränkungen geben würdest wie public, private oder protected. Das macht die Klasse von außen einsehbar oder schränkt diese ein.

Java:
public Class Haus {
private String strasse;
private int hausnummer;
private int zimmeranzahl;

public Haus(String strasse, int hausnummer, int zimmeranzahl) {
this.strasse = strasse;
this.hausnummer = hausnummer;
this.zimmeranzahl = zimmeranzahl;
}

public void setStrasse(String strasse) {
this.strasse = strasse;
}

public String getStrasse() {
return this.strasse;
}

// Weitere Getter und Setter müssen gesetzt werden.
}

Also mein Tipp wäre: Übe die Grundlagen und halte deinen Code verständlich. Verkompliziere dich nicht, denn das führt zu unnötigen Fehlern und macht deinen Code nur noch wartungsintensiver.
 
Zuletzt bearbeitet:
Ok, von der Sache her hast du recht, dass sind Objekte.
Diese bringen dir nur nix. Wie TheDirtyClown bereits erklärt hat, brauchst du Objekte der Klasse, die deine Methoden beinhaltet. Ich vermute, du hattest sowas in der Art vor:

Java:
public class ConsoleReader{

public static void main(String[]args){

ConsoleReader reader = new ConsoleReader();
reader.print();


}

public void saveData(String data){
[...]
}

public String toString(){
[...]
}

public void print(){

}


}
 
Zuletzt bearbeitet:
Danke, ich habe es verstanden und auch auf das andere Objekt angewendet. Das Programm funktioniert nun fast. Doch wenn ich in der while Bedingung "ja" eingebe und dann mehrere Dinge eingebe, gibt das Programm nach Abbruch der Schleife immer nur das letzte eingegebene Produkt aus. Wird denn der Inhalt der Methode toString bei jedem neuen Aufruf gelöscht und nicht neuer Inhalt hinzugefügt?

Java:
import java.util.Scanner;

public class Receipt {

	private static String produktname;
	private static int menge;
	private static double preis;
	private static double gesamtpreis;

	public static double berechne(int menge, double preis) {

		gesamtpreis = menge * preis;

		return gesamtpreis;

	}

	public String toString() {

		StringBuilder sb = new StringBuilder();

		sb.append(produktname + "\n");
		sb.append(menge + "x");
		sb.append("\t\t" + gesamtpreis);

		return sb.toString();

	}

	public static void main(String[] args) {

		Receipt speichern = new Receipt();
		Receipt ausgabe = new Receipt();

		String fortsetzung = " ";

		Scanner input = new Scanner(System.in);

		do {

			System.out.println("Welches Produkt möchten Sie kaufen? ");
			produktname = input.nextLine();

			System.out.println("Was für eine Menge wollen Sie kaufen? ");
			menge = input.nextInt();

			System.out.println("Wie teuer ist das Einzelprodukt? ");
			preis = input.nextDouble();

			berechne(menge, preis);
			speichern.toString();

			System.out
					.println("Geben Sie 'ja' ein, wenn Sie Ihren Einkauf fortsetzen möchten: ");
			input.nextLine();
			fortsetzung = input.nextLine();

		} while (fortsetzung.equals("ja"));

		System.out.println("--------------------------\n");
		System.out.println("      Kassenzettel\n\n");
		System.out.println("      Einkaufsliste\n");
		System.out.println("--------------------------\n");

		System.out.println(ausgabe.toString());
	}
}
 
Zuletzt bearbeitet:
Mit jeder neuen Eingabe überschreibst du die vorherige. speichern.toString ergibt keinen Sinn. speichern ist ein leeres Receipt Objekt, dm nie Werte zugewiesen werden.

Ich glaube, du hast noch nicht so wirklich verstanden, was du eigentlich machst.
 
naja, ich wollte mit der methode toString erreichen, dass immer mehr an den string angefügt wird. Leider war der Ansatz wohl falsch.
Gibt es eine Funktion, mit der man Strings zwischenspeichern/verlänger kann bei jedem Aufruf und dieses dann komplett ausgeben kann?
 
Zuletzt bearbeitet:
"toString()" gibt immer nur das Objekt als String zurück, auf welchem du die Methode aufrufst. Ich gebe nicht gern kompletten Code vor, aber ich glaube, du hast dich gerade total verrannt:

Java:
public class Kassenzettel{

	private ArrayList<Receipt> gespeicherteProdukte;

	public Kassenzettel(){
	this.gespeicherteProdukte = new ArrayList<>();
	}	
	
	public static void main(String[] args) {
 
		Kassenzettel wochenendEinkauf = new Kassenzettel();
		
		String fortsetzung = " ";
 
		Scanner input = new Scanner(System.in);
 
		System.out.println("--------------------------\n");
		System.out.println("      Kassenzettel\n\n");
		System.out.println("      Einkaufsliste\n");
		System.out.println("--------------------------\n");
 
		do {
 
			System.out.println("Welches Produkt möchten Sie kaufen? ");
			produktname = input.nextLine();
 
			System.out.println("Was für eine Menge wollen Sie kaufen? ");
			menge = input.nextInt();
 
			System.out.println("Wie teuer ist das Einzelprodukt? ");
			preis = input.nextDouble();
			
			Receipt receipt = new Receipt(produktname, menge, preis);
			wochenendEinkauf.gespeicherteProdukte.add(receipt);
 
			System.out
					.println("Geben Sie 'ja' ein, wenn Sie Ihren Einkauf fortsetzen möchten: ");
			fortsetzung = input.nextLine();
 
		} while (fortsetzung.equals("ja"));
 
		wochenendEinkauf.print();
	}
	
	public void print(){
		for(Receipt r : gespeicherteProdukte){
                    System.out.println(r.toString());
		}	
	}

}

public class Receipt {
 
	private String produktname;
	private int menge;
	private double preis;
	private double gesamtpreis;
 
	public Receipt(String produktname, int menge, double preis){
		this.produktname = produktname;	
		this.gesamtpreis = menge*preis;
		this.menge = menge;
	}
  
	public String toString() { 
   		return  this.produktname + "\n" + this.menge + "x\n" + "\t\t" + this.gesamtpreis; 
	}
 
	
}

Ungetestet.
 
Zuletzt bearbeitet:
"toString()" gibt immer nur das Objekt als String zurück, auf welchem du die Methode aufrufst. Ich gebe nicht gern kompletten Code vor, aber ich glaube, du hast dich gerade total verrannt:

Java:
public class Kassenzettel{

	private ArrayList<Receipt> gespeicherteProdukte;

	public Kassenzettel(){
	this.gespeicherteProdukte = new ArrayList<>();
	}	
	
	public static void main(String[] args) {
 
		Kassenzettel wochenendEinkauf = new Kassenzettel();
		
		String fortsetzung = " ";
 
		Scanner input = new Scanner(System.in);
 
		System.out.println("--------------------------\n");
		System.out.println("      Kassenzettel\n\n");
		System.out.println("      Einkaufsliste\n");
		System.out.println("--------------------------\n");
 
		do {
 
			System.out.println("Welches Produkt möchten Sie kaufen? ");
			produktname = input.nextLine();
 
			System.out.println("Was für eine Menge wollen Sie kaufen? ");
			menge = input.nextInt();
 
			System.out.println("Wie teuer ist das Einzelprodukt? ");
			preis = input.nextDouble();
			
			Receipt receipt = new Receipt(produktname, menge, preis);
			wochenendEinkauf.gespeicherteProdukte.add(receipt);
 
			System.out
					.println("Geben Sie 'ja' ein, wenn Sie Ihren Einkauf fortsetzen möchten: ");
			fortsetzung = input.nextLine();
 
		} while (fortsetzung.equals("ja"));
 
		wochenendEinkauf.print();
	}
	
	public void print(){
		for(Receipt r : gespeicherteProdukte){
                    System.out.println(r.toString());
		}	
	}

}

public class Receipt {
 
	private String produktname;
	private int menge;
	private double preis;
	private double gesamtpreis;
 
	public Receipt(String produktname, int menge, double preis){
		this.produktname = produktname;	
		this.gesamtpreis = menge*preis;
		this.menge = menge;
	}
  
	public String toString() { 
   		return  this.produktname + "\n" + this.menge + "x\n" + "\t\t" + this.gesamtpreis; 
	}
 
	
}

Ungetestet.

ok, danke :/ Ich schaue es mir mal komplett an.
 

Zurück
Oben