Wie kann ich einen try/catch-Block unterbrechen, ohne eine Ausnahme in Java auszulösen

Lesezeit: 4 Minuten

Benutzer-Avatar
Basilikum Musa

Ich brauche eine Möglichkeit, aus der Mitte des Try/Catch-Blocks auszubrechen, ohne eine Ausnahme auszulösen. Etwas, das dem Break and Continue in for-Schleifen ähnelt. Ist das möglich?

Ich habe seltsame Gedanken über das Auslösen einer benutzerdefinierten Ausnahme (mit dem Namen “BreakContinueException”) bekommen, die in ihrem Catch-Handler einfach nichts bewirkt. Ich bin sicher, das ist sehr verdreht.

Also, irgendeine einfache Lösung, die mir nicht bekannt ist?

Benutzer-Avatar
aiobe

Der richtige Weg, dies zu tun, besteht wahrscheinlich darin, die Methode aufzuschlüsseln, indem Sie den try-catch-Block in eine separate Methode einfügen und eine return-Anweisung verwenden:

public void someMethod() {
    try {
        ...
        if (condition)
            return;
        ...
    } catch (SomeException e) {
        ...
    }
}

Wenn der Code viele lokale Variablen enthält, können Sie auch die Verwendung von a in Betracht ziehen break aus einem beschrifteten Block, wie von Stephen C vorgeschlagen:

label: try {
    ...
    if (condition)
        break label;
    ...
} catch (SomeException e) {
    ...
}

  • @aioobe: Was tun, wenn die Methode etwas anderes zurückgeben soll als void?

    – Gruber

    1. Oktober 2015 um 8:35 Uhr

  • @Gruber, ich glaube nicht, dass ich das Problem verstehe. Im ersten Snippet müssten Sie einen Ausdruck nach dem setzen return Schlüsselwort und fügen Sie am Ende der Methode eine return-Anweisung ein.

    – aiobe

    1. Oktober 2015 um 11:37 Uhr


Benutzer-Avatar
dacwe

Du kannst es immer mit a machen break aus einem Schleifenkonstrukt oder einem beschrifteten break wie in aioobies Antwort angegeben.

public static void main(String[] args) {
    do {
        try {
            // code..
            if (condition)
                break;
            // more code...
        } catch (Exception e) {

        }
    } while (false);
}

  • Wird Vreaking auf diese Weise den finally {} Block des try catch ausführen?

    – Basilikum Musa

    30. Juni 2011 um 16:17 Uhr

  • Meiner Meinung nach, do ... while(false) sollte als schlechte Alternative zu einer beschrifteten Aussage betrachtet werden.

    – Stefan C

    24. Januar 2018 um 3:07 Uhr

  • Ich stimme @StephenC zu. Sie sollten keine Schleife verwenden, es sei denn, Sie planen eine Schleife. Es wird jeden verwirren, der jemals Ihren Code liest, einschließlich sich selbst in 2 Monaten.

    – Setholopolus

    3. März 2018 um 21:48 Uhr

  • @BasilMusa Wenn ein Codeblock mit der ausgebrochen wird break Stichwort, gilt die Sperre als “abrupt beendet”. Dasselbe gilt, wenn eine Ausnahme ausgelöst wird; ein Codeblock wird “abrupt” verlassen. Dies ist das Gegenteil von “normalem” Beenden/Beenden. finally Blöcke werden ausgeführt, wenn ihre jeweiligen try Blöcke werden normal abgeschlossen oder abrupt, so dass die Ausführung tatsächlich zum finally geht, falls es existiert, unmittelbar bevor Sie dorthin gehen, wohin Sie “gebrochen” haben.

    – Kröw

    19. August 2019 um 6:48 Uhr

Benutzer-Avatar
Stefan C

Verschiedene Wege:

  • return
  • break oder continue wenn in einer Schleife
  • break zu beschriften, wenn in einer beschrifteten Anweisung (siehe Beispiel von @aioobe)
  • break when in einer switch-Anweisung.

  • System.exit() … obwohl das wahrscheinlich nicht das ist, was Sie meinen.

Meiner Meinung nach ist “Break to Label” der natürlichste (am wenigsten verzerrte) Weg, dies zu tun, wenn Sie dies tun nur aus einem Try/Catch herauskommen wollen. Aber es könnte für unerfahrene Java-Programmierer verwirrend sein, die diesem Java-Konstrukt noch nie begegnet sind.

Aber während Labels undurchsichtig sind, verpacke ich den Code meiner Meinung nach in a do ... while (false) damit Sie eine verwenden können break ist eine schlechtere Idee. Dies wird sowohl Nicht-Neulinge als auch Neulinge verwirren. Für Anfänger (und Nicht-Neulinge!) ist es besser, etwas über beschriftete Aussagen zu lernen.


Übrigens, return funktioniert in dem Fall, wo Sie aus einem ausbrechen müssen finally. Aber Sie sollten es vermeiden, a return in einem finally blockieren, da die Semantik etwas verwirrend ist und dem Leser Kopfschmerzen bereiten kann.

Es gibt mehrere Möglichkeiten, dies zu tun:

  1. Verschieben Sie den Code in eine neue Methode und return davon

  2. Wickeln Sie den try/catch in a ein do{}while(false); Schleife.

Dies ist der Code, den ich normalerweise mache:

 try
 {
    ...........
    throw null;//this line just works like a 'break'
    ...........   
  }
  catch (NullReferenceException)
  { 
  }
  catch (System.Exception ex)
  {
      .........
  }

  • 1) Dies ist kein gültiges Java. 2) Die Frage betrifft den Ausbruch aus a try ohne eine Ausnahme zu werfen. Sie sind ausdrücklich eine Ausnahme werfen.

    – Stefan C

    4. März 2018 um 0:01 Uhr

Benutzer-Avatar
Janek Bogucki

In diesem Beispiel im Catch-Block ändere ich den Wert des Zählers und er wird während des Blocks unterbrochen:

class TestBreak {
    public static void main(String[] a) {
        int counter = 0;

        while(counter<5) {
            try {
                counter++;
                int x = counter/0;
            }
            catch(Exception e) {
                counter = 1000;    
            }
        }
    }
}k

  • 1) Dies ist kein gültiges Java. 2) Die Frage betrifft den Ausbruch aus a try ohne eine Ausnahme zu werfen. Sie sind ausdrücklich eine Ausnahme werfen.

    – Stefan C

    4. März 2018 um 0:01 Uhr

1158930cookie-checkWie kann ich einen try/catch-Block unterbrechen, ohne eine Ausnahme in Java auszulösen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy