web-dev-qa-db-fra.com

Comment puis-je rompre avec un bloc try / catch sans lever d'exception dans Java

J'ai besoin d'un moyen de rompre avec le milieu du bloc try/catch sans lever d'exception. Quelque chose qui ressemble à la pause et continue dans les boucles. Est-ce possible?

Je reçois des commentaires étranges sur le fait de lancer une exception personnalisée (en la nommant "BreakContinueException") qui ne fait rien dans son gestionnaire de capture. Je suis sûr que c'est très tordu.

Donc, une solution simple dont je ne suis pas au courant?

51
Basil Musa

La bonne façon de le faire est probablement de décomposer la méthode en plaçant le bloc try-catch dans une méthode distincte et d'utiliser une instruction return:

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

Si le code implique de nombreuses variables locales, vous pouvez également envisager d'utiliser un break à partir d'un bloc étiqueté, comme suggéré par Stephen C :

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

Vous pouvez toujours le faire avec un break d'une construction de boucle ou un break étiqueté comme spécifié dans la réponse aioobies.

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

        }
    } while (false);
}
27
dacwe

Différentes manières:

  • return
  • break ou continue en boucle
  • break pour étiqueter dans une instruction étiquetée (voir l'exemple de @ aioobe)
  • break dans une instruction switch.

...

  • System.exit() ... bien que ce ne soit probablement pas ce que vous voulez dire.

À mon avis, "casser pour étiqueter" est la façon la plus naturelle (la moins contorsionnée) de le faire si vous juste voulez sortir d'un essai/rattrapage. Mais cela pourrait être déroutant pour les novices Java programmeurs qui n'ont jamais rencontré cette construction Java.

Mais bien que les étiquettes soient obscures, à mon avis, envelopper le code dans une do ... while (false) pour que vous puissiez utiliser un break est une pire idée. Cela confondra les non-novices ainsi que les novices. Il est préférable pour les novices (et les non-novices!) De se renseigner sur les déclarations étiquetées.


Soit dit en passant, return fonctionne dans le cas où vous devez sortir d'un finally. Mais vous devez éviter de faire un return dans un bloc finally car la sémantique est un peu déroutante et susceptible de donner au lecteur mal à la tête.

13
Stephen C

Il existe plusieurs façons de procéder:

  1. Déplacez le code dans une nouvelle méthode et return à partir de celle-ci

  2. Enveloppez le try/catch dans une boucle do{}while(false);.

7
Aaron Digulla

Dans cet exemple dans le bloc catch, je change la valeur du compteur et il se cassera pendant le bloc:

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
2
Fariba

Voici le code que je fais habituellement:

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

que diriez-vous return cela fera, s'il n'y a pas finally

1
Jigar Joshi