2011-06-30 9 views
46

Potrzebuję sposobu na przełamanie od środka bloku try/catch bez rzucania wyjątku. Coś, co jest podobne do przerwania i kontynuowania pętli. Czy to możliwe?Jak mogę zerwać z bloku try/catch bez zgłaszania wyjątku w Javie?

Otrzymałem dziwne informacje o tym, jak rzucić niestandardowy wyjątek (nazywając go "BreakContinueException"), który nie robi nic w obsłudze catch. Jestem pewien, że to jest bardzo poskręcane.

Więc, jakieś proste rozwiązanie, którego nie znam?

Odpowiedz

42

Właściwym sposobem na to jest prawdopodobnie rozbić metody poprzez umieszczenie bloku try-catch w osobnej metody i użyć instrukcji return:

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

Jeśli kod obejmuje wiele zmiennych lokalnych, można również rozważyć użycie break z oznaczonym bloku, jak sugeruje Stephen C:

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

@aioobe: Co zrobić, jeśli metoda ma zwrócić coś więcej niż "void"? – Gruber

+0

@Gruber, nie sądzę, że rozumiem problem. W pierwszym fragmencie należy umieścić wyrażenie po słowie kluczowym "return" i dołączyć instrukcję return na dole tej metody. – aioobe

1

jak o return będzie to zrobić, jeśli nie ma finally

+2

sam powrót, oczywiście robi to więcej niż wyłamywanie się z try/catch. – aioobe

7

Istnieje kilka sposobów, aby to zrobić:

  1. przenieść kod do nowej metody i return od niego

  2. Zawiń try/catch w pętli do{}while(false);.

27

Zawsze można zrobić z break od konstruktu pętli lub oznaczonego break określonej w aioobies odpowiedź.

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

     } 
    } while (false); 
} 
+2

Czy vreaking w ten sposób uruchomi w końcu blok {} próby catch? –

+0

@Basil Musa: Tak! – dacwe

+1

IMO, 'do ... while (false)' powinno być uważane za kiepską alternatywę dla oświadczenia z etykietą. –

12

różne sposoby:

  • return
  • break lub continue gdy w pętli
  • break do znakowania, gdy w oznaczonym oświadczenie (patrz @ przykład aioobe za)
  • break gdy w instrukcji switch.

...

  • System.exit() ... chociaż to nie jest chyba to, co masz na myśli.

Moim zdaniem, "Break na etykiecie" jest najbardziej naturalny (przynajmniej wykrzywioną) sposobem, aby to zrobić, jeśli tylko chcą wyjść z try/catch. Ale może to być mylące dla początkujących programistów Java, którzy nigdy nie spotkali tego konstruktu Javy.

Ale gdy etykiety są niejasne, moim zdaniem zawijanie kodu w do ... while (false), tak aby można było użyć break jest gorszym pomysłem.To zmyli nie-nowicjuszy i nowicjuszy. Lepiej dla nowicjuszy (i nie-nowicjuszy!) Dowiedzieć się o znakowanych stwierdzeniach.


Nawiasem mówiąc, return prace w przypadku, gdy trzeba wyrwać z finally. Ale powinieneś unikać wykonywania bloku return w bloku finally, ponieważ semantyka jest nieco zagmatwana i może powodować ból głowy.

2

W tym próbki w bloku catch i zmienić wartość licznika i będzie przerwa, podczas gdy blok:

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 
+0

1) Pytanie dotyczy przełamania próby bez odrzucenia wyjątku. Wyrzucasz wyjątek pod okładkami i w sposób, który jest prawdopodobnie zbyt trudny do zoptymalizowania przez kompilator JIT. 2) Złapanie 'wyjątku' jest złe. –

2

Jest to kod zazwyczaj robię:

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

1) To nie jest poprawna Java. 2) Pytanie dotyczy przełamania 'try' bez wyrzucania wyjątku. Jesteś * jawnie * rzucając wyjątek. –

Powiązane problemy