Samstag, Februar 22, 2020

Werfen kann verwendet werden, anstelle von break in einer switch-Anweisung?

Werfen kann auch verwendet werden, um exit switch-Anweisung ohne break-Schlüsselwort? Warum werfen anstatt zu brechen?

switch(number)
{
    case 1:
        throw new RuntimeException("Exception number 1");
    case 2:     
        throw new RuntimeException("Exception number 2"); 
}
  • Man sollte es nicht. Ausnahmen sollten niemals verwendet werden, für die Steuerung der Strömung. Ausnahmen für Ausnahmen. Wenn eine Ausnahme Auftritt innerhalb des Schalters, dann ist es gut.
  • Weil Sie bezahlt werden, indem Sie die Anzahl der Zeichen, die Sie eingeben
  • Das man vernünftig standard, könnten Sie throw innerhalb einer switch-Anweisung im default-Fall. Wenn das erreichen dieser Fall zeigt ungültige Eingabe, dann ist es sinnvoll, eine exception zu werfen.
  • Es ist nichts besonderes über switch-Anweisungen mit Bezug auf die Ausnahmen. Die Gründe für das auslösen von Ausnahmen sind die gleichen wie in den anderen code.
InformationsquelleAutor Jerry | 2013-05-16

7 Kommentare

  1. 12

    Gibt es zwei Fälle, in denen könnte man eine throw zu unterbrechen den Fluss der ein-Schalter:

    1. Flow Control; im Allgemeinen ist dies ein bad Praxis – Sie wollen nicht außergewöhnliche Verhalten der Entscheidung, wo Sie Ihr Programm entscheidet, zu gehen weiter.

    2. Unwahrscheinlichen, aber plausibel standardmäßig der Fall; in Fall, dass Sie hit ein Zustand, in dem das erreichen der Standard – sollte unmöglich, aber doch passiert. Irgendwie. Wie durch ein Wunder. Oder, wenn Sie haben strenge coding-standards, die vorschreiben, dass switch-Anweisungen müssen einen default-Fall.

      Beispiel:

      public class Test {
          public static enum Example {
              FIRST_CASE,
              SECOND_CASE;
          }
          public void printSwitch(Example theExampleCase) {
              switch(theExampleCase) {
                  case FIRST_CASE:
                      System.out.println("First");
                      break;
                  case SECOND_CASE:
                      System.out.println("Second");
                      break;
                  default:  //should be unreachable!
                      throw new IllegalStateException(
               "Server responded with 724 - This line should be unreachable");
           }
      }
  2. 3

    Sehe ich einige Gründe für den Wurf in einer switch-Anweisung.

    1.: nicht anstatt eine Pause, aber als der Körper des default Fall. Betrachten Sie das folgende Beispiel, wo ein Schalter ist definiert eine enumeration:

    pubic enum E {
      A,
      B
    }

    Den Schalter der Zeit, wie es zuerst geschrieben, der wie folgt aussieht:

    E e = ...;
    switch (e) {
      case A:
        ...
        break;
      case B:
        ...
        break;
      default:
        throw new IllegalStateException("Unknown enumeration value " + e);
    }

    Der throw ist ein fallback für künftige Erweiterungen der Aufzählung E.

    2.: Manchmal habe ich bei denen kleine getter-Funktionen, zum Beispiel in die Swing-Tabelle Modell. Dort habe ich auch ein return anstelle von break;

    public String getColumnName(int col)
    {
      switch (col)
      {
        case 0: return "Column 0";
        case 1: return "Column 1";
        ...

    Dies ist aus Gründen der Kürze oder Kompaktheit. Man kann sagen, dass diese Renditen brechen die Ablaufsteuerung. Dies ist die wahre. Ich denke aber, dass für die Kompaktheit Gründe könnte es erlaubt sein hier.

    Wenn Sie akzeptieren return statt einer break in diesem Fall können Sie akzeptieren throw auch hier.

    Object[] x = ...; //get some array which is not null from a function which
                      //only returns arrays, e.g. OSGI services
    switch (x.length)
    {
      case 0: throw new IllegalArgumentException("No service defined");
      case 1: return x[0]; //return the only available service
      default:
        ... //evaluate all services and return the best matching one
        return x[...];
    }
    • Ich Neige dazu, Zustimmen. Wenn Sie decken alle möglichen Fälle in der Schalter „Fall“ beschrieben werden, dann warum nicht werfen Sie eine Ausnahme in der „default“ – Abschnitt zunächst zeigen die eingehenden parameter ist falsch und die zweite zum Schutz gegen eine zukünftige Erweiterung der switch-Konstruktion.
  3. 1

    Können Sie throw im switch block, aber nicht gute coding/design-Praxis. throw gedacht, um außergewöhnliche Kontrolle/error situation code nicht für die Kontrolle der Ausführung der Anweisungen.

    Eventhough Sie können throw im switch würde ich recommded, es nicht zu verwenden in switch. 🙂

  4. 0

    Du redest nur ein Szenario, wo Sie brauchen, um werfen der Ausnahme. der switch ist konzipiert, um einen Fall und es brechen. Wenn es in einer Methode und wenn man nur werfen, wie werden wir dann zurückgeben einen Wert aus dieser Methode?
    In einfachen Worten werfen, wird wieder die Methode, aber brechen nicht. Können Sie weiterhin mit Ihrem code nach dem Umschalten mit Pause aber nicht mit werfen.

  5. 0

    Pause wird verwendet, um zu verhindern, fallen durch, um den nächsten Fall, wenn Sie eine exception werfen, wird es keine fallenden thru

        case 1:
            throw new UnsupportedOperationException();
            break;   <-- compile error, unreachable code

    Es in der Regel sinnvoll, eine Ausnahme in der sonst Klausel

        switch (op) {
        case 1:
            //do something 
            break;
        ...
        default:
            throw new UnsupportedOperationException();
        }
  6. 0

    Gibt es wenige Probleme mit werfen, anstatt break;

    1), wenn Sie werfen einige Ausnahme der Ausführung der rest der Funktion beendet.

    ie:

    int m=0;
        switch (m) {
        case 0:
            y=10;
            break;
        case 2:
            y=11;
            break;
        default:
            break;
        }
        System.out.println(y);//this y will never be printed if Exceptions are thrown

    2) Ausnahmen von der Regel stellen einige Fehler,und wechseln nicht jedes mal erstellen, die Ausnahme.

    3), Um den Wert „Ausnahme Nummer 1“ von

    throw new RuntimeException("Exception number 1");

    müssen Sie wright catch-block und rufen Sie e.getMessage();

    wie:

    catch(RuntimeException e){
            String str=e.getMessage();
        }

    dies ist noch mehr Aufwand und auch die Daten, die Sie übergeben können, ist nur String-Objekt.

    Fazit:-
    Es ist besser, verwenden Sie die normale Pause.

  7. -1

    werfen Kann nicht verwendet werden, anstelle von break in einer switch-Anweisung. denn werfen ist nur für Ausnahmen verwendet, während Schalter verwendet wird für die bedingte Zwecke…

    • Sie können throw neben return oder break im switch, da alle drei von Ihnen vollständige abrupt (das ist, die Steuerung wieder an einem anderen Ort als dem aktuell Laufenden Methode).

Kostenlose Online-Tests