Interpreter-Fehler Übersetzungsfehler?

dima4400

Mitglied
Hey leute,

ich bin ein ein absoluter Anfänger was den Umgang mit Java betrifft - habe auch vorher noch nie wirklich programmiert!

Ich soll ein Programm schreiben, dass Bücher (max. 50) mit Titel, Autor, ISBN und co. speichert und am Ende wieder ausgibt.
Zur besseren Verständniss poste ich mal kurz die Aufgabe:

Implementieren Sie ein Bibliotheksprogramm, welches empfohlene Bücher für Ihr Studium verwaltet.
Alle Daten eines Buches wie Titel, Autor, ISBN, Verlag Erscheinungsjahr und Preis sollen in einem
kompositen Datentyp zusammengefasst und über die Konsole eingegeben werden. Da Sie nur über ein
begrenztes Budget verfügen, lassen Sie sich alle Bücher, die nach 1995 erschienen sind und weniger
als 50 € kosten, auf dem Bildschirm anzeigen.
Definieren Sie einen Datentyp für die Beschreibung von Buchobjekten, wobei für den Autor (Name,
Vorname) ein eigener Datentyp zu definieren ist. Gehen Sie davon aus, dass maximal 100 Bücher
verwaltet werden.

So, dass programm habe ich jetzt geschrieben und ich denke ich bin auch fertig. Der Compiler hat auch zunächst keine Probleme mir das Programm zu übersetzen und die class datei zu erstellen!
Bei der Anwendung jedoch habe ich ein Problem. Immer wenn ich bereits den Titel eingeben will kommt eine Fehlermeldung. Leider weiß ich nicht warum. Ich habe die Variable "titel" als String deklariert, also sollte das programm doch auch leerzeichen und zeichenketten lesen müssen!

Java:
import java.util.Scanner;

public class Bibliothek {								//Beginn der Klasse Bibliothek
	public static void main (String[] args) {			//Beginn der main-Methode 	
	
		class AutorT {									//Deklaration der Klasse "AutorT"
			String vorname;
			String nachname;
		}												//AutorT - Dateneingabe des Autors
		
		class BuchT {									//Deklaration der Klasse "BuchT"
			String titel;
			String AutorT;
			int isbn;
			int erscheinungsjahr;
			double preis;
		}												//BuchT - Dateneingabe des Buches
	
	Scanner in = new Scanner (System.in);				//Vorbereitung des Programms auf externe Eingabe
	
	System.out.println ("Fuer wieviele Buecher sollen Daten erfasst werden? Bitte beachten Sie, dass das Programm maximal 50 Buecher einlesen kann");
	int anzahl = in.nextInt();
	
	BuchT[]b = new BuchT [anzahl];						//Erstellen eines eindimensionalen Arrays fuer "BuchT" mit "anzahl" Feldern
	AutorT[]a = new AutorT [anzahl];					//Erstellen eines eindimensionalen Arrays fuer "AutorT" mit "anzahl" Feldern
	
	for (int k = 0; k<anzahl; k++) {					//Eingaben der Daten - Schleife wiederholen bis "anzahl" erreicht ist!
	
		System.out.println ("Bitte den Titel eingeben: ");	//Titel
		b[k].titel = in.next();
		
		System.out.println ("Bitte den Vor- und Nachnemen des Autors eingeben: ");	//Autorname angaben (eingabe fuer die Klasse AutorT)
		System.out.println ("Vorname des Autors: ");
		a[k].vorname = in.next();
		System.out.println ("Nachname des Autors: ");
		a[k].nachname = in.next();
		
		System.out.println ("Bitte die ISBN-Nummer angeben: ");						//ISBN
		b[k].isbn = in.nextInt();
		
		System.out.println("Bitte das Erscheinungsjahr fuer das Buch angeben (Das Buch sollte erst 1995 erschienen sein!): ");
		b[k].erscheinungsjahr = in.nextInt();										//Erscheinungsjahr
		
		System.out.println("Bitte den Preis fuer das Buch eingeben: ");
		b[k].preis = in.nextDouble();												//Preis
	}	//Ende der for-Schleife (Wiederholen, bis "anzahl" erreicht wurde (alle Buecher eingetippt wurden)
	
	for (int k=0; k<anzahl; k++) {														//Anfang der Print-Schleife (Ausgabe)
		if (b[k].erscheinungsjahr>1995 && b[k].preis>50) {
		System.out.println( " Titel: "+b[k].titel+	" ISBN: "+b[k].isbn + " Erscheinungsjahr: "+b[k].erscheinungsjahr + " Preis: " + b[k].preis + " Autorvorname: "+a[k].vorname + " Autornachname: "+a[k].nachname);
		}
	}																				//Ende der Print-Schleife
	}																				//Ende Main
}
 

Final_Striker

Top Contributor
Du bekommst eine
Code:
NullPointerException
weil dein Buchobjekt auf welches du zugreifen willst
Code:
null
ist.

Java:
BuchT[]b = new BuchT [anzahl];

Damit legst du ein Buch-Array von der Größe
Code:
anzahl
an. Damit hast du aber noch keine Bücher erstellst.

Java:
b[i] = new Buch();
b[i].isbn = "42";

Erst wenn du ein Objekt erstellst hast, kannst du auf seine Attribute zugreifen.

Beim Autor Array natürlich das gleiche.


Laut deiner Aufgabenstellung, soll man eigentlich bis zu 100 Bücher verwalten können, nur so neben bei. ;-)

Gehen Sie davon aus, dass maximal 100 Bücher
verwaltet werden.
 

Fab1

Top Contributor
Hallo dima4400,

Du erstellt hier ein Array von
Code:
BuchT[]b = new BuchT [anzahl];
allerdings sind in diesem Array noch keine lauffähigen Objekte. Das Array besagt nur, dass hier für die entsprechende Anzahl von Objekten Platz ist, aber drin sind noch keine. Somit kannst du diese unten natürlich auch nicht ansprechen.

Bei:
Java:
b[k].titel = in.readLine();

Das Objekt von b an der Stelle k existiert noch nicht. Und somit kannst du natürlich auch nicht den Titel davon ansprechen.

[EDIT]
folgendes sollte helfen. :)

Java:
   BuchT[]b = new BuchT [anzahl];                      //Erstellen eines eindimensionalen Arrays fuer "BuchT" mit "anzahl" Feldern
    AutorT[]a = new AutorT [anzahl];                    //Erstellen eines eindimensionalen Arrays fuer "AutorT" mit "anzahl" Feldern
    
    for(int i = 0; i<anzahl; i++){
    	b[i] = new BuchT();         // Objekte werden erstellt. :-)
    	a[i] = new AutorT();
    }
[/EDIT]
 
Zuletzt bearbeitet:

irgendjemand

Top Contributor
wem kommt diese frage hier nicht auch bekannt vor ?

@TO
dieses problem wurde erst neulich schon mal gepostet ... vielleicht mitschüler / student von dir ?
nutze bitte sufu um dies zu finden ...

[EDIT]same-time-post overkill xD[/EDIT]
 

dima4400

Mitglied
danke für die Info,
war genau der Fehler, dass ich keine Objekte für mein Array erstellt habe.

das Programm läuft jetzt einwandfrei danke also
anbei nochmal der fertige quelltext, falls es jemanden interessiert (verbesserungsvorschläge werden gerne angenommen!)
Java:
import java.util.*;

public class Bibliothek {								//Beginn der Klasse -Bibliothek-
	public static void main (String[] args) {			//Beginn der main-Methode 	
	
		class AutorT {									//Deklaration der Klasse "AutorT"
			String vorname;
			String nachname;
		}												//AutorT - Variablendeklaration fuer  Klasse 
		
		class BuchT {									//Deklaration der Klasse "BuchT"
			String titel;
			int isbn;
			int erscheinungsjahr;
			double preis;
		}												//BuchT - Variablendeklaration fuer Klasse
	
	Scanner in = new Scanner (System.in);				//Vorbereitung des Programms auf externe Eingabe
	
	System.out.print("\n");								//Leerzeilen oder auch "Freizeilen" fuer eine bessere Foramtierung in der Anwendung
	System.out.print("\n");
	System.out.println("Dieses Programm verwaltet Buecher mit all ihren Daten. Bitte verwenden Sie");
	System.out.println("bei der Eingabe statt einem Leerzeichen einen Punkt '.' oder");
	System.out.println("einen Unterstrich '_'");
	
	System.out.print("\n");								//Leerzeile
	System.out.println ("Fuer wieviele Buecher sollen Daten erfasst werden? Bitte beachten Sie, dass das Programm maximal 100 Buecher einlesen kann");
	int anzahl = in.nextInt();
	
	System.out.print("\n");								//Leerzeile
	
	BuchT[]b = new BuchT [anzahl];						//Erstellen eines eindimensionalen Arrays fuer "BuchT" mit "anzahl" Feldern
	AutorT[]a = new AutorT [anzahl];					//Erstellen eines eindimensionalen Arrays fuer "AutorT" mit "anzahl" Feldern
	
	
	for (int k = 0; k<anzahl; k++) {					//Eingaben der Daten - Schleife wiederholen bis "anzahl" erreicht ist! -> Eingabeprozess
	
		b[k] = new BuchT();								//Objekte fuer Array BuchT werden erstellt
		a[k] = new AutorT();							//Objekte fuer Array AutorT werden erstellt
	
	
		System.out.println ("Bitte den Vor- und Nachnamen des Autors eingeben: ");	//Autorname (Eingabe fuer die Klasse AutorT)
		System.out.println ("\n");													
		System.out.println ("Vorname des Autors: ");
		a[k].vorname = in.next();
		
		System.out.println ("Nachname des Autors: ");
		a[k].nachname = in.next();
		
	
		System.out.println ("Bitte den Titel eingeben: ");							//Titel (Eingabe fuer die Klasse BuchT)
		b[k].titel = in.next();
		
		System.out.println ("Bitte die ISBN-Nummer angeben: ");						//ISBN
		b[k].isbn = in.nextInt();
		
		System.out.println("Bitte das Erscheinungsjahr fuer das Buch angeben (Das Buch sollte nach 1995 erschienen sein!): ");
		b[k].erscheinungsjahr = in.nextInt();										//Erscheinungsjahr
		
		System.out.println("Bitte den Preis fuer das Buch eingeben: ");
		b[k].preis = in.nextDouble();												//Preis
	}																				//Ende der for-Schleife (Wiederholen, bis "anzahl" erreicht wurde)
																					//Ende des Einlese-Prozesses des Programms
	
		for (int k = 0; k<anzahl; k++) {											//Anfang der Print-Schleife (Ausgabeprozess)
			if (b[k].erscheinungsjahr>1995 && b[k].preis<50) {
				System.out.println("\n");
				System.out.println( " Titel: "+b[k].titel+	" ISBN: "+b[k].isbn + " Erscheinungsjahr: "+b[k].erscheinungsjahr);
				System.out.println(" Preis: " + b[k].preis + " Autorvorname: "+a[k].vorname + " Autornachname: "+a[k].nachname);
			}							
			else {
				System.out.println("\n");
				System.out.println(" Die Bedinungen, dass das Erscheinungsjahr nach 1995 liegt und unter 50 Euro kostet sind nicht erfuellt!");
			}
		}																				//Ende der Print-Schleife
	}																					//Ende Main
}																						//Ende der Klasse Bibliothek
 

AquaBall

Top Contributor
Nur so am Rande: Aufgabe falsch erfüllt!
Ich soll ein Programm schreiben, dass Bücher (max. 50) speichert.
...
Implementieren Sie ein Bibliotheksprogramm, gehen Sie davon aus, dass maximal 100 Bücher verwaltet werden.
Was nun
Code:
50
oder
Code:
100
?


Außerdem: Die Einschränkung ist völlig sinnlos, weil du ja das Feld eh dynamisch anlegst:
Java:
	System.out.println ("Fuer wieviele Buecher sollen Daten erfasst werden?");
	int anzahl = in.nextInt();
	if (anzahl>50) {  // oder doch "anzahl>100" , Obwohl das Programm beliebig viele könnten
		System.out.println ("Das Programm darf sinfreierweise maximal 50 Buecher lesen können!");
		trow (Böser Programmierer!)
	}
	
	BuchT[]b = new BuchT [anzahl];						//Erstellen eines eindimensionalen Arrays fuer "BuchT" mit "anzahl" Feldern
	AutorT[]a = new AutorT [anzahl];					//Erstellen eines eindimensionalen Arrays fuer "AutorT" mit "anzahl" Feldern

}
 

Final_Striker

Top Contributor
anbei nochmal der fertige quelltext, falls es jemanden interessiert (verbesserungsvorschläge werden gerne angenommen!)

Nicht alles in die main-Methode packen.
Man erstellst auch keine anderen Klassen in der main-Methode.

Java:
        class BuchT {                                   //Deklaration der Klasse "BuchT"
            String titel;
            String AutorT;
            int isbn;
            int erscheinungsjahr;
            double preis;
        }

Variable [c]AutorT[/c] sollte [c]autorT[/c] heißen. Variablennamen beginnen mit einem kleinen Buchstaben. Edit: Hat sich erledigt, war nur im ersten Post so :)

Wofür steht eigentlich überall das T am Ende des Namens?
 
Zuletzt bearbeitet:

dima4400

Mitglied
Das T hat keine Bedeutung, das habe ich aus der Vorlesung mitgenommen - da wurde es eingeführt, damit keine Verwirrung entsteht ( "StudentT [] studis = new StudentT[anzahl];")

@AquaBalls:
Danke für die Info. Das habe ich jetzt ganz außer acht gelassen! Es sind übrigens maximal 100 Bücher!
 

dima4400

Mitglied
ok, die Bedinung mit den 100 Büchern kann man in eine if-Anweisung packen. Wenn es also mehr als 100 sind kommt eine Fehlermeldung.
Was muss ich aber in schreiben, wenn ich will, dass nach der Fehlermeldung der Anwender eine neue Eingabe machen soll, die unter 100 büchern liegt (bzw. unter 101 bücher)
 

dima4400

Mitglied
das hab ich mir schon gedacht..
ich mach das ganze jetzt mit einer if-anweisung

Java:
if (anzahl>100) {
		System.out.println("Das Programm kann maximal 100 Buecher einlesen! Bitte korrigieren Sie Ihre Eingabe.");
		*leider kenn ich keine Anweisung zur Wiederholung einer Eingabe*
		}

wie kann ich dem programm jetzt klarmachen, dass ich nochmals eine Eingabe für "anzahl" fordere?
 

dima4400

Mitglied
Hab das jetzt mit einer While-Schleife gelöst, weil ich dachte dass eine do-schleife mindestens einmal ausgeführt wird und im nachhinein erst die Bedinung überprüft wird.

Naja auf jeden fall hab ich es jetzt verstanden und den Befehl für eine externe Eingabe ebenfalls.
Ich dneke damit sollte die Aufgabe erfüllt sein!

Java:
while (anzahl>100) {								//Korrigier-Schleife, falls mehr als 100 Buecher eingegeben wurden
		System.out.println("Das Programm kann maximal 100 Buecher einlesen. Bitte korrigieren Sie Ihre Eingabe");
		anzahl = in.nextInt();
	}

Danke nochmal an alle hat mir echt geholfen!
 

AquaBall

Top Contributor
Hab das jetzt mit einer While-Schleife gelöst, weil ich dachte dass eine do-schleife mindestens einmal ausgeführt wird und im nachhinein erst die Bedinung überprüft wird.

Naja auf jeden fall hab ich es jetzt verstanden und den Befehl für eine externe Eingabe ebenfalls.
Ich dneke damit sollte die Aufgabe erfüllt sein!

Java:
while (anzahl>100) {								//Korrigier-Schleife, falls mehr als 100 Buecher eingegeben wurden
	System.out.println("Das Programm kann maximal 100 Buecher einlesen. Bitte korrigieren Sie Ihre Eingabe");
	anzahl = in.nextInt();
}

Danke nochmal an alle hat mir echt geholfen!

[TIPP]Den Unterschied du völlig richtig erkannt, beides hat unterschiedlich Anwendungsziele und Vor- und Nachteile.[/TIPP]

In deiner Anwendung:
Variante "while":
Code:
Der Eingabe-Aufruf muss zweimal programmiert werden.
(Bietet bessere Benutzerführung, ist für den Benutzer angenehmer, aber eigentlich vom Programmierstil nicht elegant und nicht gewünscht.)
Java:
System.out.println("Bitte Anzahl der Buecher eingeben: ");
anzahl = in.nextInt();   // !!! doppelt programmiert! Fehlerquelle!

while (anzahl>100) {	//Korrigier-Schleife, falls mehr als 100 Buecher eingegeben wurden
	System.out.println("Das Programm kann maximal 100 Buecher einlesen. Bitte korrigieren Sie Ihre Eingabe");
	anzahl = in.nextInt();    // !!! doppelt programmiert! Fehlerquelle!
}

Variante "do":
Code:
Der Benutzer wird mit unnötigem Kommentar zugemüllt.
(Ist vom Programmierstil bequemer; aber für den Benutzer nicht sympatisch, sofort mit einem langen Text (fast Fehlermeldung) 'belästigt' zu werden.
Java:
do {			//Korrigier-Schleife, falls mehr als 100 Buecher eingegeben wurden
	System.out.println("Das Programm kann maximal 100 Buecher einlesen. Bitte korrigieren Sie Ihre Eingabe");
	anzahl = in.nextInt();
} while (anzahl>100)

deshalb:
ergonomischere Variante "do ohne doppelten Eingabebefehl":
Code:
Der Benutzer wird freundlich, sympatisch empfangen, keine Programmzeile muss doppelt geschrieben/gewartet werden.
(Es muss halt eine kleine Hilfsvariable geführt werden.)
Java:
Boolean ersterStart=true;
do {	
	if (ersterStart)  System.out.println("Bitte Anzahl der Buecher eingeben: ");
	else System.out.println("Das Programm kann maximal 100 Buecher einlesen! Bitte Anzahl korrigieren: ");
	anzahl = in.nextInt();
	ersterStart=false;
} while (anzahl>100)
 
Zuletzt bearbeitet:
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben