3 Häufig gepostete Fragen

3.1 [LANG] Die Sprache Java

3.2 [STRING] Strings

3.3 [IO] Eingabe/Ausgabe, Streams, etc.

3.4 [NET] Netzwerk

3.5 [AWT] Abstract Window Toolkit

3.6 [SWING] Swing, das bevorzugte GUI

3.7 [APPLET] Java-Applets und ihre Zusammenarbeit mit Browsern

3.8 [SERVER] Servlets und andere Server-Implementierungen in Java

3.9 [NONCORE] Klassen/Packages, die über den Kern der Sprache hinausgehen, also Java3D etc.

3.10 [OOP] OOP-Konzepte und Patterns in Java

3.11 [JDK] Virtuelle Maschinen, alles über JDKs und deren Installation und Verwendung

3.12 [TOOLS] Java-Zusatz-Tool, zum Beispiel IDEs, Build-Tools, Profiler, etc.

3.13 [MISC] Alles, was nicht in eine der anderen Rubriken paßt

3.14 [ERROR] Fehlermeldungen


3.14 [ERROR] Fehlermeldungen

Zurück zu "3 Häufig gepostete Fragen"

3.14.1 Warum findet Java den Konstruktor nicht?

Problem:

public class Test {

    private int a;
    private int b;

    public void Test (int a , int b) {
        this.a = a;
        this.b = b;
    }

    public static void main (String[] args) {

        //Und hier eine Fehlermeldung.
        Test myTest = new Test (12, 13);
    }
}

Versucht man die obige Klasse zu übersetzen, so meckert der Compiler mit der Meldung Wrong number of arguments in constructor ... . Die Lösung des Problems ist einfach: Konstruktoren besitzen keinen Rückgabetyp, auch nicht void. In obigem Beispiel hat man nämlich nicht den Konstruktor für die Klasse Test definiert, sondern eine Funktion, die den selben Namen wie die Klasse hat. Weiter unten versucht man nun, den vermeintlich definierten Konstruktor aufzurufen und bekommt die beschriebene Fehlermeldung.

Lösung:

public class Test {

    private int a;
    private int b;

    public Test (int a , int b) {
        this.a = a;
        this.b = b;
    }

    public static void main (String[] args) {

        //Hier kommt jetzt keine Fehlermeldung mehr!
        Test myTest = new Test (12 , 13);
    }
}

Autor: Markus Reitz

Zurück zu "3.14 [ERROR] Fehlermeldungen"

3.14.2 Warum bekomme ich eine "NoClassDefFoundError" Fehlermeldung beim Starten von java?

Der Grund ist einfach: Man muß der Java-Laufzeitumgebung mitteilen, wo sich die *.class-Dateien des Programms befinden, damit die Ausführung erfolgen kann. Dies erreicht man bei der SUN-Implementierung mit dem Aufrufparameter -cp für Classpath oder man setzt die Umgebungsvariable CLASSPATH auf das Verzeichnis, in dem sich die *.class-Dateien befinden.

Autor: Markus Reitz

Zurück zu "3.14 [ERROR] Fehlermeldungen"

3.14.3 Warum bekomme ich eine "Couldn't read <Name>" Fehlermeldung beim Kompilieren mit javac?

In Java gilt die einfache Regel, daß der Name der Datei, in der die Klasse gespeichert ist, identisch mit dem Klassennamen sein muß, wobei auf die korrekte Groß- und Kleinschreibung zu achten ist.

Autor: Markus Reitz

Zurück zu "3.14 [ERROR] Fehlermeldungen"

3.14.4 Warum bekomme ich eine "class <Name> must be defined in a file called <Name>" Fehlermeldung beim Kompilieren von javac?

Hier gilt analog das unter dem vorherigen Punkt angeführte. Eine Datei, in der der Quelltext der Klasse gespeichert ist, muß den selben Namen besitzen wie die Klasse im Quelltext.

Autor: Markus Reitz

Zurück zu "3.14 [ERROR] Fehlermeldungen"

3.14.5 Warum wird beim Zugriff auf ein korrekt initialisiertes Objekt- Array eine NullPointerException geworfen?

Problem:

public class A {
    public String text;
}

public class Test {
    public static void main (String[] args) {
        A array = new A[10];
        for(int i = 0; i < 10; i++) {
            //wirft NullPointerException
            array[i].text = "Test";
        }
    }
}

Führt man das Programm aus, so erhält man die im Programmtext erwähnte NullPointerException, obwohl doch alles eigentlich ganz in Ordnung aussieht. Der Teufel steckt aber im Detail. Mit A array[] = new A[10] wird eben nicht ein Array von zehn Objekten vom Typ A erzeugt, sondern nur ein Array, welches zehn Referenzen auf Objekte vom Typ A enthält, die eigentlichen Objekte werden damit nicht erzeugt.

Lösung:

public class A {
    public String text;
}

public class Test {
    public static void main (String[] args) {
        A array = new A[10];
        for(int i = 0; i < 10; i++) {
            array[i] = new A();
            //wirft keine NullPointerException mehr
            array[i].text = "Test";
        }
    }
}

Autor: Markus Reitz

Zurück zu "3.14 [ERROR] Fehlermeldungen"

3.14.6 Warum bekomme ich eine NullPointerException, wenn ich versuche, auf Methoden oder Attribute von in einem Array gespeicherten Objekten zuzugreifen?

Vermutlich hast Du zwar den Array erzeugt, nicht jedoch die Objekte. Dann sind die Fields Deines Array mit null initialisiert, d.h. die Referenzen existieren zwar, nicht jedoch die referenzierten Objekte.

Abhilfe:
Um z.B. einen Array von sechs Buttons zu erzeugen, geht man so vor:

Button[] myButtons = new Button[6];

for (int i = 0; i < myButtons.length; i++) {
    myButtons[i] = new Button();
}

Autor: Michael Paap

Zurück zu "3.14 [ERROR] Fehlermeldungen"

3.14.7 Warum meckert der Compiler bei nicht initialisierten final Variablen?

Ab Java 1.1 ist folgender Code gültig:

public class Test {
    final int i;

    public Test(int i) {
        //finale Variable this.i wird mit dem Wert
        //von i initialisiert.
        this.i = i;
    }

    public Test() {
        //Fehler die finale Variable this.i muss auch in diesem
        //Konstruktor initialisiert werden.
    }
}

Es ist also möglich, Variablen mit finalen Werten zu erzeugen, deren finaler Wert beim ersten initialisieren der Variablen einmalig festgelegt werden kann. Allerdings kann dies nur innerhalb eines Konstruktors geschehen und es muß auf jeden Fall eine Initialisierung der Variablen erfolgen, denn ansonsten meldet der Compiler Fehler.

Autor: Markus Reitz

Zurück zu "3.14 [ERROR] Fehlermeldungen"

3.14.8 Was hat die Compilerfehlermeldung "... is deprecated" zu bedeuten?

Diese Meldung erhält man normalerweise dann, wenn ältere Java-Programme mit einer neuen Version des Compilers übersetzt werden sollen. Die Meldung ist nur eine Warnung, also kein richtiger Fehler, die Funktionalität des Programms wird nicht beeinträchtigt. Die Methode, die bei der Meldung "... is deprecated" genannt wird, sollte aber nach Möglichkeit nicht mehr im Programm verwendet werden, da das Konzept der Klasse verändert wurde und deshalb die Methode unter Umständen in neueren Versionen nicht mehr implementiert sein wird. Treten also solche Meldungen beim Compilieren auf, so sollte man die entsprechenden Methoden durch die empfohlenen Varianten ersetzen, damit gewährleistet ist, daß das Programm auch mit späteren Versionen von Java einwandfrei übersetzt werden kann.

Autor: Markus Reitz

Zurück zu "3.14 [ERROR] Fehlermeldungen"
Hosted by www.Geocities.ws

1