MINT lernen

Wie ein Java-Programm entsteht

Wer meckert eigentlich, wenn ein Semikolon fehlt — und warum läuft dieselbe .class-Datei auf jedem Laptop der Klasse?

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Zehn Übungen zum Klicken, Ziehen und Knobeln — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du hängst, helfen dir die gestuften Tipps.

A1
Vom Quelltext zur Ausgabe
AFB I

Nils hat seinen ersten Java-Wecker in der Datei Wecker.java geschrieben. Welche Aussagen stimmen?

Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Die Reihenfolge ist immer: erst javac (übersetzen), dann java (ausführen). Weil javac die ganze Datei vorab prüft, läuft bei einem Tippfehler gar nichts — auch nicht die fehlerfreien Zeilen davor. Das ist der große Unterschied zu Python. Bytecode ist für die JVM gedacht, nicht für Menschen; geändert wird immer der Quelltext.
Ansatz: Zeichne die Kette auf: Wecker.java → javac → ? → java → Ausgabe. Was steht an der Stelle des Fragezeichens?
Weiter: Der Compiler übersetzt nur, wenn die ganze Datei fehlerfrei ist. Gibt es dann überhaupt schon etwas, das die JVM ausführen könnte?
A2
Stimmt's? — Das Grundgerüst
AFB I

Fünf Behauptungen über den Aufbau eines Java-Programms.

Fünf Aussagen nacheinander. Eine falsche Einschätzung reicht — dann startest du die Serie mit „Neue Runde“ neu.
Aussage 1 von 5

Merksatz: Java ist pingelig — Semikolon, geschweifte Klammern, Groß-/Kleinschreibung und Dateiname müssen stimmen. Dafür findet javac solche Fehler, bevor dein Programm überhaupt startet.
Ansatz: Überlege bei jeder Aussage: Was ist in Python anders? Genau dort lauern die Fallen.
Weiter: Das „ln“ in println steht für „line“ — also für den Zeilenumbruch.
A3
Das Grundgerüst ergänzen
AFB I

Ergänze den Wecker so, dass er übersetzt wird und „Aufstehen!“ ausgibt — ein Baustein bleibt übrig.

Wort anklicken, dann Lücke anklicken (oder umgekehrt) — mit Tab und Enter geht es genauso. Ein Klick auf eine gefüllte Lücke legt das Wort zurück.

public Wecker {
    public main( args) {
        System.out.("Aufstehen!");
    }
}

def bleibt übrig — so beginnt in Python eine Funktion, in Java gibt es dieses Wort nicht. Die Zeile public static void main(String[] args) ist der feste Startpunkt jedes Java-Programms; sie wird anfangs einfach auswendig gelernt. void heißt: main liefert keinen Wert zurück.
Ansatz: Die erste Zeile legt eine Klasse an. Die zweite ist der Kopf der Startmethode main.
Weiter: Der Kopf von main lautet immer „public static void main(String[] args)“. Ein Wort aus der Wortbank stammt aus Python.
A4
Von der Idee bis zur Playlist
AFB II

Emir schreibt ein Programm Playlist, das seine Lieblingssongs in der Konsole auflistet. Bring die Schritte in die richtige Reihenfolge.

Ziehe die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
1Quelltext in die Datei Playlist.java schreiben und speichern
2Im Terminal javac Playlist.java eingeben
3Der Compiler prüft die ganze Datei auf Fehler
4Die Datei Playlist.class mit Bytecode entsteht
5Im Terminal java Playlist eingeben
6Die JVM führt den Bytecode aus — die Songs erscheinen in der Konsole
Häufig verrutscht die Prüfung: Sie passiert vor dem Entstehen der .class-Datei — findet javac einen Fehler, entsteht gar keine. Achte auch auf die Befehle: javac bekommt den Dateinamen mit Endung .java, java den Klassennamen ohne .class.
Ansatz: Es gibt zwei Befehle im Terminal. Welcher braucht das Ergebnis des anderen?
Weiter: Zu jedem Befehl gehört genau ein Schritt, der danach „im Inneren“ passiert: javac → prüfen und Bytecode erzeugen, java → ausführen.
A5
Wer meldet sich — javac, JVM oder keiner?
AFB II

Jede Karte steht für eine Zeile im Programm oder eine Situation beim Ausführen. Wann fällt der Fehler auf — oder läuft alles durch?

Ziehe jede Karte in den passenden Korb — oder wähle sie mit Enter aus und drücke dann die Ziffer des Korbs (0 legt sie zurück).
1javac meldet einen Fehler
2Absturz beim Ausführen
3läuft ohne Absturz
javac erkennt alles, was man am Text sehen kann: falsche Schreibweise, fehlende Klammern, unbekannte Methoden. Probleme, die erst von den Daten beim Ausführen abhängen (eine Eingabe „vierzehn“, ein Buchstabe, den es nicht gibt), meldet die JVM als Laufzeitfehler. Und Achtung: „läuft ohne Absturz“ heißt nicht „richtig“ — mit print klebt die nächste Ausgabe in derselben Zeile. Ein auskommentierter Befehl braucht kein Semikolon, weil javac ihn gar nicht liest.
Ansatz: Kann man den Fehler schon am Quelltext erkennen, ohne das Programm zu starten? Dann meldet sich javac.
Weiter: Leerzeichen innerhalb einer Anweisung sind Java egal. Alles hinter // ist Kommentar.
A6
Meldung und Ursache
AFB II

Beim Wecker-Programm tauchen fünf verschiedene Meldungen auf (gekürzt). Verbinde jede Meldung mit ihrer Ursache.

Ansatz: „symbol“ ist ein Name, den javac nicht kennt. „end of file“ heißt: Die Datei ist zu Ende, bevor alles geschlossen ist.
Weiter: „string literal“ ist ein Text in Anführungszeichen. „load main class“ scheitert, wenn es die .class-Datei noch gar nicht gibt.
A7
Der Speiseplan der Kantine
AFB II

Das Programm soll den Speiseplan zeigen, aber javac meldet Fehler. Drei Zeilen sind falsch.

Klicke die fehlerhaften Zeilen an und tippe darunter jeweils die ganze korrigierte Zeile ein. „Prüfen“ kontrolliert erst deine Auswahl, dann die Korrekturen.
Zeile 3: Das Semikolon fehlt. Zeile 5: Die Methode heißt println — printline kennt javac nicht („cannot find symbol“). Zeile 6 ist der Python-Fehler schlechthin: In Java stehen Texte immer in doppelten Anführungszeichen; einfache sind für ein einzelnes Zeichen reserviert, deshalb meldet javac „unclosed character literal“. Das Komma in „3,50“ ist kein Fehler — es steht im Text und wird nur ausgegeben.
Ansatz: Prüfe jede Zeile auf drei Dinge: Endet sie richtig? Ist der Methodenname korrekt geschrieben? Stehen Texte in den richtigen Anführungszeichen?
Weiter: Alles innerhalb von "…" ist für javac nur Text — dort ist auch ein Komma erlaubt. Die Einrückung spielt keine Rolle.
A8
print oder println?
AFB III

Lara schickt sich selbst eine Erinnerung. Was erscheint in der Konsole?

public class Bus {
    public static void main(String[] args) {
        System.out.print("Ich ");
        System.out.println("bin");
        System.out.println();
        System.out.print("gleich ");
        System.out.print("da");
        System.out.println("!");
        // System.out.println("Tschüss");
        System.out.print("Bus kommt");
    }
}
Löse die Kette Schritt für Schritt: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
  1. Wie viele Zeilen zeigt die Konsole insgesamt? (Leerzeilen zählen mit) Zeilen
  2. Wie viele Zeichen stehen in der ersten Zeile? (Leerzeichen zählen mit) Zeichen
  3. Was steht in der dritten Zeile? (genau abschreiben)
  4. Transfer: Lara löscht die Zeile System.out.println();. Wie viele Zeilen zeigt die Konsole jetzt? Zeilen
Die Ausgabe lautet: „Ich bin“ · (leere Zeile) · „gleich da!“ · „Bus kommt“. print schreibt nur, println schreibt und springt danach in die nächste Zeile; println() ohne Text erzeugt genau eine Leerzeile. „Tschüss“ erscheint nie, weil die Zeile auskommentiert ist. Häufiger Fehler: jede Anweisung als eigene Zeile zählen — dann kommt man auf 7.
Ansatz: Schreibe die Ausgabe Zeichen für Zeichen auf ein Blatt. Mache nur dann einen Zeilenumbruch, wenn ein println ausgeführt wurde.
Weiter: In „Ich “ steckt am Ende ein Leerzeichen. Die Zeile mit // wird nicht ausgeführt.
A9
Python oder Java?
AFB IIIMix

Du kennst Python aus „Programmieren für Anfänger“. Gilt die Aussage nur für Python, nur für Java oder für beide?

Setze pro Zeile genau ein Kreuz. Enter setzt und löscht.
Aussagenur Pythonnur Javabeide
Blöcke werden durch Einrückung festgelegt.
Jede Anweisung endet mit einem Semikolon.
Groß- und Kleinschreibung wird unterschieden.
Ein Kommentar beginnt mit //.
Die übliche Ausgabe (print bzw. System.out.println) beendet danach die Zeile.
Ein falsch geschriebener Befehl in einer Zeile, die nie erreicht wird, fällt beim Start nicht auf.
Jedes Programm braucht eine Klasse mit einer main-Methode.
Der Kern-Unterschied steckt in Zeile 6: Python führt Zeile für Zeile aus — ein Tippfehler wie pritn in einem Zweig, der nie drankommt, bleibt unbemerkt. javac prüft dagegen jede Zeile vorab und meldet „cannot find symbol“, auch wenn sie nie ausgeführt würde. Gemeinsam haben beide Sprachen die Groß-/Kleinschreibung und dass die Standard-Ausgabe die Zeile beendet — Pythons print entspricht also Javas println, nicht print.
Ansatz: Schreibe im Kopf dasselbe Mini-Programm einmal in Python und einmal in Java und vergleiche Zeile für Zeile.
Weiter: In Python beginnt ein Kommentar mit #. Und: Wer prüft in Java den Text, bevor das Programm läuft?
A10
Trick: Chaos-Code
AFB IIITrick

Jonas hat sein Programm sehr „kreativ“ formatiert. Seine Freundin sagt: „Das übersetzt nie!“

public class Chat
{
public static void main(String[] args) {
System.out.println("Treffen um 15 Uhr // Eingang");
    // System.out.println("Absage");
        System.out.println("Nicht vergessen: }"); System.out.println(
"Ball mitbringen");
}
}

Wie viele Zeilen gibt das Programm aus? Trage 0 ein, falls javac einen Fehler meldet.

Überlege selbst und trage das Ergebnis ein — Enter prüft direkt.
Es sind 3 Zeilen: „Treffen um 15 Uhr // Eingang“, „Nicht vergessen: }“ und „Ball mitbringen“. Drei Fallen: (1) // und } innerhalb von Anführungszeichen sind nur Text — kein Kommentar, keine Klammer. (2) Einrückung und Zeilenumbrüche sind Java egal; zwei Anweisungen in einer Zeile oder eine Anweisung über zwei Zeilen sind erlaubt. (3) Nur die Zeile, die wirklich mit // beginnt, fällt weg. Lesbar ist das trotzdem nicht — ordentlich einrücken solltest du für Menschen.
Ansatz: Frage dich bei jedem Sonderzeichen: Steht es innerhalb oder außerhalb von Anführungszeichen?
Weiter: Zähle die println-Anweisungen, die nicht auskommentiert sind. Java liest eine Anweisung bis zum Semikolon — egal wie viele Zeilen das sind.