Lädt...

Werfen in Java

Schreib du den Stopp selbst mit throw. Oeffne Signal.java und wirf IllegalArgumentException mit der Nachricht empty, bevor irgend etwas water druckt. Kompiliere mit javac Signal.java und starte java Signal. Das Programm stoppt auf der throw-Zeile; water wird nicht gedruckt. Eine zweite Demo setzt cups auf 0, damit ein if betreten wird und geworfen wird. Eine dritte Demo setzt cups auf 3, damit das if uebersprungen wird und der Bildschirm water druckt. Lass Dateilesen fuer die naechste Seite.

Du schreibst den Stopp

Fruehere Seiten zeigten einen Stopp, weil eine Zeile eine Regel brach — ein schlechter Array-Index warf ArrayIndexOutOfBoundsException. Diese Seite ist die andere Richtung. Du waehlst den Exception-Typ und schreibst throw, damit der Stopp absichtlich passiert. Oeffne eine Uebungsdatei Signal.java. Halte den oeffentlichen Klassennamen Signal, damit er zum Dateinamen passt. Loesche uebrig gebliebene Guard-catch-Demos, Alarm-Array-Stops und jedes Scanner oder nextLine. Das Programm darf nicht auf Tastatur warten. Diese Seite braucht keine import-Zeile.
In main wirf vor jedem ruhigen Erfolgs-print:
throw new IllegalArgumentException("empty");
Dann behalte einen print, der nicht laufen soll, wenn der throw feuert:
System.out.println("water");
Die Woerter in Anfuehrungszeichen sind die Nachricht. Der Typname ist IllegalArgumentException. Du teilst nicht durch null und liest nicht slots[5]. Der Stopp ist da, weil du throw geschrieben hast.

Signal bare throw stops before water

java
public class Signal {
    public static void main(String[] args) {
        throw new IllegalArgumentException("empty");
        // water would not run after throw
    }
}

Im Ordner mit Signal.java fuehre javac Signal.java aus. Wenn Klammern, geschweifte Klammern und Semikolons passen, schreibt javac keine eigene Zeile. Dann java Signal — nicht java Signal.java. Lass .java beim Startbefehl weg.
Der Lauf stoppt auf der throw-Zeile. Das Terminal nennt IllegalArgumentException und zeigt die Nachricht empty. Ein print von water nach diesem throw laeuft nicht, weil das Programm schon gestoppt hat. Haeltst du einen unerreichbaren System.out.println("water"); nach dem throw in derselben main, warnen manche Compiler, dass der print unerreichbar ist; die Lehridee bleibt: nach throw laufen normale Zeilen auf diesem Pfad nicht. Bevorzuge die nackte throw-Datei ohne toten print, wenn javac ueber unerreichbaren Code meckert — der Stopp selbst ist die Lektion.
Wartet das Terminal auf Tastatur, steckt noch ein nextLine-Aufruf aus einer aelteren Uebung in einer Datei. Loesche ihn. Siehst du blocked dann after, laeuft noch eine Guard-catch-Datei — wechsle zu java Signal. Siehst du ArrayIndexOutOfBoundsException von slots[5], ist noch ein Alarm-Rest aktiv; ersetze ihn durch die throw-Zeile fuer diese Lektion.

Null cups betritt if und wirft

Ein zweites Programm startet neu. Speichere cups als 0. Wenn cups kleiner als 1 ist, wirf dieselbe IllegalArgumentException mit Nachricht empty. Behalte einen print von water nach dem if.

Signal zero cups throws

java
public class Signal {
    public static void main(String[] args) {
        int cups = 0;
        if (cups < 1) {
            throw new IllegalArgumentException("empty");
        }
        System.out.println("water");
    }
}

Kompiliere mit javac Signal.java, dann starte java Signal. Null ist kleiner als eins, also wird das if betreten und throw ausgefuehrt. Der Bildschirm zeigt denselben Stopp: IllegalArgumentException und empty. Das Wort water wird nicht gedruckt. Nichts auf dieser Seite faengt den Stopp, das Programm endet dort. Das ist absichtlich — die letzte Seite uebte catch; diese Seite uebst das Schreiben von throw.
Geh die Klammern einmal durch. Die throw-Zeile sitzt im if-Block. Der water-print sitzt ausserhalb des if. Sobald throw laeuft, hat das Programm schon gestoppt, water wird nie erreicht. Einrueckung und Klammern setzen den throw in die Pruefung.

Drei cups ueberspringen throw und drucken water

Ein drittes Programm startet ebenfalls neu. Setze cups auf 3. Behalte dasselbe if, denselben throw und denselben water-print.

Signal three cups prints water

java
public class Signal {
    public static void main(String[] args) {
        int cups = 3;
        if (cups < 1) {
            throw new IllegalArgumentException("empty");
        }
        System.out.println("water");
    }
}

Kompiliere und starte erneut mit javac Signal.java und java Signal. Drei ist nicht kleiner als eins, also wird das if nicht betreten. Der throw laeuft nie. Der Bildschirm druckt water. Es gibt keinen Stopp. Dieser Kontrast ist der Checkpoint: der throw feuert nur, wenn deine Bedingung sagt, der Wert ist nicht brauchbar.
Erfinde auf dieser Seite keinen catch um diese Uebungsdateien. Du hast catch auf Guard schon geuebt. Hier musst du den Stopp sehen, den du schriebst, und den Pfad, der den throw ueberspringt. Ersetze IllegalArgumentException nicht durch ArrayIndexOutOfBoundsException fuer leere cups — dieser Name gehoerte zu einem schlechten Array-Index, nicht zu einer Wertpruefung, die du mit throw selbst schriebst.

Der Name, den du schriebst

Der Typ, den du warfst, ist IllegalArgumentException, nicht ArrayIndexOutOfBoundsException und nicht das nackte Wort empty als Typ. Die Nachricht empty ist, was du neben dem Namen zeigen wolltest. Faengst du diesen Stopp spaeter, muss die catch-Klausel IllegalArgumentException nennen. Ein catch fuer NullPointerException wuerde ihn nicht behandeln. Diese catch-Uebung ist auf den Signal-Dateien heute nicht noetig.
IllegalArgumentException ist eine Laufzeit-Exception im ueblichen Anfaengergebrauch, diese kleinen main-Demos brauchen keine throws-Klausel auf main. Bleib bei diesem einen klaren Typ und dieser Nachricht. Du brauchst keinen Katalog aller werfbaren Klassen, bevor die naechste Seite eine Datei oeffnet.

Verglichen mit catch auf Guard

Auf der try-catch-Seite behandelte java Guard einen schlechten Index und lief bis after. Auf dieser Seite verursacht java Signal absichtlich einen Stopp und faengt ihn nicht. Die Array-Geschichte ist Geschichte. Behalte Guard-Dateien nur als aeltere Demos in der Naehe; starte java Signal fuer die throw-Demos, damit der Bildschirm zu dieser Lektion passt.

Was diese Seite fuer files laesst

Diese Seite zeigt nur, dass du mit throw einen Stopp verursachst. Die naechste Seite beginnt mit Dateilesen. Bleib beim Schreiben des Stopps und beim Ueberspringen, wenn cups brauchbar ist. Oeffne noch keine Datei als Pflicht auf diesen Signal-Demos.

Vor files

Du kannst IllegalArgumentException("empty") werfen und sehen, dass der Lauf vor water stoppt. Mit cups bei 0 wird das if betreten und derselbe Stopp passiert. Mit cups bei 3 laeuft throw nie und der Bildschirm druckt water. Kompiliere Signal.java und starte java Signal fuer jede behaltene Demo der Reihe nach. Der Name dieses Stopps ist IllegalArgumentException. Die naechste Seite ist Dateilesen.
Behalte den nackten throw fuer einen klaren Stopp, den du schriebst. Behalte das cups-Paar fuer eine Bedingung, die den throw ueberspringen kann. Halte Dateilesen von dieser Seite fern. Diese drei Gewohnheiten sind der Checkpoint vor dem Weitergehen. Wenn water nur beim cups-bei-drei-Lauf von java Signal erscheint, hat throwing seine Arbeit fuer diese Lektion getan und du bist bereit fuer das naechste Thema ueber Dateien.

🧠 Testen Sie Ihr Wissen

Bereit zum Start

Testen Sie Ihr Wissen

Fordern Sie sich mit diesem interaktiven Quiz heraus und sehen Sie, wie gut Sie das Thema verstehen

❓
4
Fragen
🎯
70%
Zum Bestehen
♾️
∞
Zeit
🔄
∞
Versuche

📝 Anweisungen

  • Lesen Sie jede Frage sorgfältig
  • Wählen Sie die beste Antwort für jede Frage
  • Sie können das Quiz so oft wiederholen, wie Sie möchten
  • Ihr Fortschritt wird oben angezeigt