"Grundkurs Programmieren in Java - (5. Auflage, 2010)"
2001-2010, Carl Hanser Verlag
Lösungsvorschlag zu Aufgabe 8.7 (Version 3.0)
(c) 2001-2010 D. Ratz, J. Scheffler, D. Seese, J. Wiesenberger
Fehler1.java:
Im Konstruktor (Zeile 8) steht:
name = name;
Das Argument wird also sich selbst zugewiesen, die Instanzvariable name bleibt
davon aber unberührt, sie behält ihren Initialisierungswert: null. Die Ausgabe
des Programms ist deshalb:
E:\hiwi\temp>java Fehler1
Name = null
Es handelt sich also um einen logischen Fehler!
Richtig müßte es heißen:
this.name = name
Fehler2.java:
Die toString-Methode ist versehentlich mit kleinem s geschrieben
(Zeile 12):
public String tostring() {
Da in Java zwischen Groß- und Kleinschreibung unterschieden wird, ist dies eine
andere Methode als die toString()-Methode, die bei der Übergabe eines
Objektes als Argument an System.out.println aufgerufen wird, weshalb sich
folgende Programmausgabe ergibt:
E:\hiwi\temp>java Fehler2
Fehler2@720eeb
Es handelt sich also wieder um einen logischen Fehler!
Richtig müßte es heißen:
public String toString() {
Fehler3.java:
Der Programmierer hat versehentlich den Konstruktor der Klasse Fehler2 anstelle
der Klasse Fehler3 aufgerufen:
System.out.println(new Fehler2("Testname"));
In der Aufgabenstellung wird davon ausgegangen, dass sich im aktuellen Verzeichnis noch die
Dateien der vorherigen Teilaufgabe (nämlich Fehler2.java und/oder Fehler2.class)
befinden, so dass ich das Programm trotzdem compilieren und ausführen läßt:
E:\hiwi\temp>java Fehler3
Fehler2@3179c3
Unter dieser Annahme handelt es sich um einen logischen Fehler.
Anmerkung:
Wird die Datei Fehler3.java alleine übersetzt (es befinden sich weder
Fehler2.java noch Fehler2.class im aktuellen Verzeichnis; weiter darf
sich im durch die Umgebungsvariable CLASSPATH spezifizierten Suchpfad für
Klassen auch keine Klasse names Fehler2 befinden), so wird sich der Compiler
beschweren:
E:\hiwi\temp>javac Fehler3.java
Fehler3.java:18: cannot resolve symbol
symbol : class Fehler2
location: class Fehler3
System.out.println(new Fehler2("Testname"));
^
1 error
Fehler4.java:
Das Programm ist korrekt und erzeugt die gewünschte Ausgabe:
E:\hiwi\temp>java Fehler4
Name = Testname
Fehler5.java:
Der Konstruktor in Zeile 7 sollte keinen Rückgabe-Typ (wie hier void) haben:
public void Fehler5(String name) {
Es handelt sich um einen Compiler-Fehler:
E:\hiwi\temp>javac Fehler5.java
Fehler5.java:18: cannot resolve symbol
symbol : constructor Fehler5 (java.lang.String)
location: class Fehler5
System.out.println(new Fehler5("Testname"));
^
1 error
Richtig wäre:
public Fehler5(String name) {
Fehler6.java:
In Zeile 18 wird ein Objekt der Klasse Fehler6 mittels default-Konstruktor
erzeugt:
Fehler6 variable = new Fehler6();
Da in Zeile 7 aber ein eigener (nicht-default-)Konstruktor (also nicht parameterlos)
geschrieben wurde, verschwindet damit der von Java sonst erzeugte default-Konstruktor.
Beim Compileraufruf ergibt sich deshalb folgende Fehlermeldung:
E:\hiwi\temp>javac Fehler6.java
Fehler6.java:18: cannot resolve symbol
symbol : constructor Fehler6 ()
location: class Fehler6
Fehler6 variable = new Fehler6();
^
1 error
Abhilfe schafft die Ergänzung eines leeren Default-Konstruktors:
public Fehler6 () {}