Besser lernen

Java-Fehlermeldungen verstehen: die 10 häufigsten auf Deutsch

Veröffentlicht am 22. Oktober 20266 Min. Lesezeit

Du drückst auf Ausführen, und statt einer Ausgabe kommt rote Schrift auf Englisch. Das passiert allen, auch Profis, jeden Tag. Die gute Nachricht: Fast alle Fehler am Anfang gehören zu einer Handvoll Meldungen. Hier lernst du die zehn häufigsten kennen, jeweils mit einem kleinen kaputten Beispiel und der Lösung.

So liest du eine Java-Fehlermeldung

Der Compiler javac übersetzt deinen Code, bevor er läuft. Findet er einen Fehler, sieht das so aus:

Main.java:3: error: ';' expected
        int age = 17
                    ^
1 error

Darin stecken drei Informationen:

  1. Datei und Zeile: Main.java:3 heißt Zeile 3.
  2. Die Meldung: Alles nach error: sagt, was Java stört.
  3. Das Dach ^: Es zeigt auf die Stelle, an der Java aufgegeben hat. Der eigentliche Fehler steht oft genau dort oder kurz davor.

Bei mehreren Meldungen gilt: Behebe immer die erste zuerst und kompiliere neu. Ein einziger Fehler kann viele Folgefehler auslösen, die danach von selbst verschwinden.

Syntaxfehler: Java versteht den Satzbau nicht

1. ';' expected

Am Ende einer Anweisung fehlt ein Semikolon. Java merkt das erst am Zeilenende, darum zeigt das Dach hinter die 17.

int age = 17System.out.println(age);

Lösung: int age = 17;. Steht die Meldung bei einer Zeile, die korrekt aussieht, schau in die Zeile davor. Eine Verwandte ist ')' or ',' expected: Dann fehlt eine schließende runde Klammer, oft vor dem Semikolon.

2. reached end of file while parsing

Java ist am Ende der Datei angekommen, aber ein Block ist noch offen. Es fehlt eine schließende geschweifte Klammer.

public class Main {    public static void main(String[] args) {        System.out.println("Hallo");    }

Lösung: Ergänze die fehlende } am Ende. Damit das nicht wieder passiert, schreib zu jeder { sofort die passende } und rücke sauber ein. Die Formatieren-Funktion im Editor zeigt dir schnell, wo ein Block nicht passt.

Namen und Typen

3. cannot find symbol

Die häufigste Meldung überhaupt. Java kennt einen Namen an dieser Stelle nicht. Welcher es ist, steht unter symbol:.

Main.java:4: error: cannot find symbol
        System.out.println(Count);
                           ^
  symbol:   variable Count
  location: class Main

Typische Ursachen:

  • Tippfehler oder Groß- und Kleinschreibung: Count ist nicht count, string ist nicht String.
  • Variable nicht angelegt: Du benutzt sie, bevor du sie mit Typ deklariert hast.
  • Falscher Block: Eine Variable aus einer Schleife oder einem if gilt nur darin.
  • Fehlender Import: Scanner braucht import java.util.Scanner;, wie im Artikel zu Ein- und Ausgabe in Java gezeigt.

4. incompatible types: String cannot be converted to int

Der Wert passt nicht zum Typ der Variable. Hier soll Text in eine Zahl.

int points = "12";

Lösung: Entweder int points = 12; ohne Anführungszeichen, oder du wandelst bewusst um: int points = Integer.parseInt("12");. Die Meldung nennt immer beide Typen, erst den gelieferten, dann den verlangten.

5. incompatible types: possible lossy conversion from double to int

Ein double soll in eine int-Variable. Dabei gingen die Nachkommastellen verloren, darum weigert sich Java.

double average = 2.7;int rounded = average;

Lösung: Nimm den passenden Typ (double rounded = average;) oder wandle ausdrücklich um: int rounded = (int) average;. Achtung, das schneidet ab und ergibt 2, nicht 3. Zum Runden gibt es Math.round.

6. bad operand types for binary operator '>'

Der Operator passt nicht zu den Typen. Klassiker: Strings mit > oder == vergleichen.

Main.java:7: error: bad operand types for binary operator '>'
        if (name > "Leon") { }
                 ^
  first type:  String
  second type: String

Lösung: Strings vergleichst du mit Methoden. name.equals("Leon") prüft Gleichheit, name.compareTo("Leon") > 0 die alphabetische Reihenfolge. Mehr dazu im Artikel über Strings in Java.

Methoden, Variablen und Klassen

7. missing return statement

Die Methode verspricht einen Rückgabewert, aber nicht jeder Weg endet mit return.

static int max(int a, int b) {    if (a > b) {        return a;    } else if (b >= a) {        return b;    }}

Für dich ist klar, dass einer der Fälle immer zutrifft. Java prüft das aber nicht inhaltlich. Lösung: Mach aus else if ein einfaches else oder setz ein return ans Ende. Wie Rückgabewerte funktionieren, erklärt der Artikel zu Methoden und Rekursion.

8. variable sum might not have been initialized

Die Variable wird gelesen, bevor sie sicher einen Wert hat. Hier bekommt sum nur im if einen Wert.

int sum;if (x > 0) {    sum = 5;}System.out.println(sum);

Lösung: Gib der Variable gleich beim Anlegen einen Startwert, also int sum = 0;.

9. non-static method greet() cannot be referenced from a static context

main ist static. Es gehört zur Klasse, nicht zu einem Objekt, und kann darum nicht direkt auf Methoden oder Variablen ohne static zugreifen. Für Variablen heißt die Meldung non-static variable count cannot be referenced from a static context.

public class Main {    void greet() {        System.out.println("Hi");    }
    public static void main(String[] args) {        greet();    }}

Lösung: Schreib static void greet(), oder leg ein Objekt an: new Main().greet();. Was der Unterschied genau bedeutet, lernst du bei Klassen und Objekten.

10. class Hello is public, should be declared in a file named Hello.java

Eine public-Klasse muss genauso heißen wie ihre Datei. Die Datei heißt Main.java, die Klasse aber Hello.

public class Hello {    public static void main(String[] args) {        System.out.println("Hi");    }}

Lösung: Benenne die Klasse in Main um, oder die Datei in Hello.java. Das passiert oft, wenn du Code aus einem Video oder Chat übernimmst.

Und Exceptions zur Laufzeit?

Manche Fehler meldet nicht der Compiler, sondern erst das laufende Programm. Dann siehst du eine Exception mit Zeilennummer:

Ausgabe
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
	at Main.main(Main.java:5)

Das Array hat drei Elemente mit den Indizes 0 bis 2, die Schleife wollte Index 3 lesen. Fast immer steht in der Bedingung <= statt <. Siehe dazu Arrays in Java. Die zweite häufige Exception ist die NullPointerException, etwa Cannot invoke "String.length()" because "name" is null: Eine Variable zeigt auf kein Objekt. Wie du solche Ausnahmen gezielt behandelst, steht im Artikel zu Ausnahmen und Enums.

Fehlermeldungen schneller verstehen mit Jario

Wenn du Java lokal einrichtest, kommt oft noch ein Fehler vor allen anderen. Dafür gibt es einen eigenen Beitrag: „javac wird nicht erkannt“. In Jario fällt das weg, weil der Code im Browser geschrieben und auf unserem Server ausgeführt wird.

Bei Compilerfehlern hilft Jario dir an zwei Stellen. Bei der Meldung erklärt ein Hinweis „Was heißt das?“ die häufigen Compilerfehler auf Deutsch, also genau die Meldungen aus diesem Beitrag. Reicht das nicht, kannst du den KI-Tutor mit „Fehler erklären“ fragen. Er kennt die Aufgabe und deinen Code und erklärt den Fehler an deiner Stelle, ohne dir die Lösung zu schreiben. Außerdem markiert der Editor Fehler direkt im Code, und eine Endlosschleife friert nichts ein, sondern wird mit „Zeitlimit überschritten. Vermutlich eine Endlosschleife.“ gestoppt.

Wer Fehler lieber in einen Chat kopiert, findet in Java lernen mit ChatGPT Regeln, mit denen du dabei trotzdem etwas lernst. Und wenn du in der Klausur ohne Compiler auskommen musst, hilft dir Java-Klausur auf Papier. Lies jede Meldung ab jetzt einmal bewusst: erste Meldung, Zeile, Dach. Nach ein paar Tagen erkennst du die zehn Klassiker auf einen Blick.

Passende Artikel zum Lernen

Weitere Beiträge