"Grundkurs Programmieren in Java - Band 1 (3. Auflage, 2006)"
2001-2006, Carl Hanser Verlag

Lösungsvorschlag zu Aufgabe 10.7 (Version 3.0)

(c) 2001-2006 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 () {}