Countdown für Mias Party
AFB I–IIMia hat auf ihrem Windows-Laptop ihr erstes Java-Programm geschrieben und als Party.java gespeichert. Es soll ihren Freunden anzeigen, wie lange es noch bis zu ihrer Geburtstagsparty dauert. Ihr Freund Tom benutzt einen Linux-Rechner.
public class Party {
public static void main(String[] args) {
// Countdown für Mias Geburtstag
System.out.print("Noch ");
System.out.print(3);
System.out.println(" Tage bis zur Party!");
System.out.println("Bring gute Laune mit.");
}
}
- Nenne die beiden Befehle, die Mia in der Konsole eingibt, damit ihr Programm läuft, und die Datei, die dabei neu entsteht.
- Ermittle die genaue Ausgabe des Programms. Achte auf die Zeilenumbrüche.
- Erkläre, warum Tom die neu entstandene Datei auf seinem Linux-Rechner starten kann, ohne das Programm noch einmal zu übersetzen.
- Vergleiche den Weg vom Quelltext zur Ausgabe bei Java mit dem bei Python.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
println setzt am Ende einen Zeilenumbruch. Kommentare mit // werden nicht ausgegeben.„Ermitteln“ heißt: das Ergebnis selbst herausfinden und genau notieren.Hinweis zu Aufgabe c)
Hinweis zu Aufgabe d)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
javac Party.java übersetzt den Quelltext, java Party startet das Programm. Dabei entsteht die Datei Party.class mit dem Bytecode.
Erwartungshorizont zu Aufgabe b)
Noch 3 Tage bis zur Party! Bring gute Laune mit.
Die beiden print-Befehle schreiben „Noch “ und „3“ in dieselbe Zeile, erst das erste println beendet die Zeile. Der Kommentar erscheint nicht.
Erwartungshorizont zu Aufgabe c)
Party.class enthält Bytecode, keinen Maschinencode für Windows. Den Bytecode führt die Java Virtual Machine (JVM) aus. Weil es für Windows, macOS und Linux jeweils eine JVM gibt, läuft dieselbe .class-Datei auch auf Toms Linux-Rechner, sofern dort Java installiert ist.
Erwartungshorizont zu Aufgabe d)
Java: javac übersetzt die ganze Datei vorab in Bytecode (.class), die JVM führt ihn danach aus. Viele Fehler (z. B. Tippfehler, falsche Typen) meldet schon der Compiler, bevor irgendetwas läuft.
Python: Der Interpreter führt den Quelltext direkt aus, eine eigene Übersetzungsdatei legt man nicht an. Viele Fehler fallen erst auf, wenn die betroffene Zeile an der Reihe ist.
Gemeinsam: Beide brauchen auf dem Rechner ein Programm, das den Code ausführt (JVM bzw. Python-Interpreter).
Das Vokabel-Quiz will nicht
AFB II–IIILea programmiert ein kleines Vokabel-Quiz. Die Methode Integer.parseInt(…) wandelt einen Text wie "12" in die Zahl 12 um. Beim Übersetzen meldet javac einen Fehler. Lea behauptet: „Wenn ich den Fehler behebe und javac nichts mehr meldet, läuft mein Programm garantiert fehlerfrei.“
public class Quiz {
public static void main(String[] args) {
System.out.println("Was heißt Hund auf Englisch?");
system.out.println("Antwort: dog");
int punkte = Integer.parseInt("zehn");
System.out.println("Punkte: " + punkte);
}
}
public class Quiz.Quiz.java:4: error: package system does not exist
system.out.println("Antwort: dog");
^
1 error
javac Quiz.java- Analysiere die Meldung in Material 2: In welcher Zeile liegt der Fehler, was ist die Ursache, und wie lautet die Korrektur?
- Bestimme, was nach der Korrektur beim Übersetzen und beim Ausführen passiert. Gib die Konsolenausgabe an.
- Widerlege Leas Behauptung. Unterscheide dabei Compilerfehler und Laufzeitfehler.
- Beurteile, ob es für Lea ein Vorteil ist, dass Java das ganze Programm vor dem Start prüft. Denke dabei an dasselbe Programm in Python.
Hinweise
Hinweis zu Aufgabe a)
^ zeigt auf die Stelle. Java unterscheidet Groß- und Kleinschreibung.„Analysieren“ heißt: die Meldung in ihre Bestandteile zerlegen und jeden deuten.Hinweis zu Aufgabe b)
"zehn" in eine Zahl umgewandelt werden? Was wurde schon ausgegeben, bevor Zeile 5 an der Reihe ist?Hinweis zu Aufgabe c)
Hinweis zu Aufgabe d)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
Quiz.java:4 – der Fehler steht in Zeile 4. Dort steht system klein geschrieben. Java unterscheidet Groß- und Kleinschreibung und sucht deshalb etwas namens system, das es nicht gibt („package system does not exist“). Korrektur: System.out.println("Antwort: dog");
Erwartungshorizont zu Aufgabe b)
javac meldet keinen Fehler mehr, Quiz.class entsteht. Beim Ausführen erscheinen die ersten beiden Zeilen, dann bricht das Programm in Zeile 5 ab:
Was heißt Hund auf Englisch? Antwort: dog Exception in thread "main" java.lang.NumberFormatException: For input string: "zehn" at Quiz.main(Quiz.java:5)
(Die JVM gibt zusätzlich einige interne Zeilen aus.) „Punkte: …“ wird nicht mehr ausgegeben.
Erwartungshorizont zu Aufgabe c)
Nach der Korrektur übersetzt javac das Programm ohne Meldung, trotzdem stürzt es beim Ausführen ab. Die Behauptung ist also falsch.
Der Compiler prüft nur Schreibweise und Typen: Integer.parseInt(…) bekommt einen Text – das ist erlaubt. Dass der Text "zehn" keine Zahl ist, zeigt sich erst beim Ausführen. Das ist ein Laufzeitfehler. Der Fehler aus a) war dagegen ein Compilerfehler: Das Programm konnte gar nicht erst starten.
Erwartungshorizont zu Aufgabe d)
Vorteil: Java meldet den Tippfehler in Zeile 4 sofort beim Übersetzen, mit Zeile und Stelle. In Python würde das Programm erst die Frage ausgeben und dann in dieser Zeile abbrechen. Stünde der Fehler in einem selten genutzten Programmteil, fiele er in Python vielleicht erst viel später auf.
Grenze: Laufzeitfehler wie in Zeile 5 findet auch Java nicht vorab. Testen bleibt also nötig.
Mögliches Urteil: Die Vorab-Prüfung ist ein Vorteil, weil viele Fehler früh und genau gemeldet werden – sie ersetzt aber nicht das Ausprobieren des Programms. Ein anderes Urteil ist vollständig, wenn es Vorteil und Grenze abwägt.
