Java Try Catch enfin bloque sans Catch


125

J'examine un nouveau code. Le programme a uniquement un bloc try et un bloc. Puisque le bloc catch est exclu, comment le bloc try fonctionne-t-il s'il rencontre une exception ou quelque chose de jetable? Va-t-il juste directement au bloc final?



25
@mP Tout le monde devrait faire des révisions de code et leur poser des questions est de savoir comment apprendre et s'améliorer.
Carl Pritchett

Réponses:


130

Si l'un des codes du bloc try peut lever une exception vérifiée, il doit apparaître dans la clause throws de la signature de méthode. Si une exception non vérifiée est levée, elle est exclue de la méthode.

Le bloc finally est toujours exécuté, qu'une exception soit levée ou non.


11
Le premier paragraphe n'est pas nécessairement vrai. Les blocs Try peuvent être imbriqués. Toute exception non interceptée, non cochée ou non, sortira de la méthode.
Andy Thomas

4
Les blocs Try peuvent être imbriqués, mais je ne le recommanderais pas. Je n'écris pas de code de cette façon.
duffymo

2
@duffymo: Que signifie "bouillonné hors de la méthode"?
Aujourd'huiIL appris le

5
@Anet juste un langage légèrement non technique pour "lever une exception".
duffymo

2
Non ignoré; passer la chaîne de méthodes.
duffymo

93

Une petite note sur try/ finally: Le finally s'exécutera toujours sauf si

  • System.exit() est appelé.
  • La JVM plante.
  • Le try{}bloc ne se termine jamais (par exemple, une boucle sans fin).

4
Et quoi try{..} catch{ throw ..} finally{..}? Je pense que finalement ne sera pas exécuté
sbeliakov

10
Dans ce cas, enfin sera toujours appelé. Seule l'exception d'origine est perdue.
Peter Lawrey du

Enfin ne sera pas exécuté non plus si vous appelez System.exit () avant.
mmirror

2
@jyw C'est ce que je voulais dire par le premier élément de la liste ci-dessus.
Peter Lawrey

Je dois dire que cela couvre toutes les bases!
Oscar Bravo

39

La spécification du langage Java (1) décrit comment try-catch-finallyest exécuté. Ne pas avoir de prise équivaut à ne pas avoir de prise capable d'attraper le lancer donné.

  • Si l'exécution du bloc try se termine brusquement à cause du lancement d'une valeur V, alors il y a un choix:
    • Si le type d'exécution de V est assignable au paramètre de n'importe quelle clause catch de l'instruction try, alors
      ……
    • Si le type d'exécution de V n'est pas assignable au paramètre d'une clause catch de l'instruction try, alors le bloc finally est exécuté . Ensuite, il y a un choix:
      • Si le bloc finally se termine normalement, alors l'instruction try se termine brusquement en raison d'un lancement de la valeur V.
      • Si le bloc finally se termine brusquement pour la raison S, alors l'instruction try se termine brusquement pour la raison S (et le lancement de la valeur V est rejeté et oublié).

(1) Exécution de try-catch-finally


16

L'intérieur est finalement exécuté avant de lancer l'exception sur le bloc externe.

public class TryCatchFinally {

  public static void main(String[] args) throws Exception {

    try{
        System.out.println('A');
        try{
            System.out.println('B');
            throw new Exception("threw exception in B");
        }
        finally
        {
            System.out.println('X');
        }
        //any code here in the first try block 
        //is unreachable if an exception occurs in the second try block
    }
    catch(Exception e)
    {
        System.out.println('Y');
    }
    finally
    {
        System.out.println('Z');
    }
  }
}

Résulte en

A
B
X
Y
Z

6

Le bloc finally est toujours exécuté après la fin du bloc try, que l'essai se termine normalement ou anormalement en raison d'une exception, euh, jetable.

Si une exception est levée par l'un des codes du bloc try, alors la méthode actuelle relance simplement (ou continue de lancer) la même exception (après avoir exécuté le bloc finally).

Si le bloc finally lève une exception / erreur / jetable, et qu'il y a déjà un jetable en attente, cela devient moche. Franchement, j'oublie exactement ce qui se passe (tant pour ma certification il y a des années). Je pense que les deux objets jetables sont liés ensemble, mais il y a un vaudou spécial que vous devez faire (c'est-à-dire - un appel de méthode que je devrais rechercher) pour obtenir le problème d'origine avant que le «enfin» ne vole, euh, vomi.

Incidemment, try / finally est une chose assez courante à faire pour la gestion des ressources, car java n'a pas de destructeurs.

Par exemple -

r = new LeakyThing();
try { useResource( r); }
finally { r.release(); }  // close, destroy, etc

« Enfin », un petit conseil: si vous ne dérange pas de mettre en une prise, que ce soit spécifique de capture (attendue) des sous - classes throwable ou prises juste « Throwable », pas « Exception », un fourre-tout piège d'erreur générale. Trop de problèmes, tels que les erreurs de réflexion, lancent des «erreurs» plutôt que des «exceptions», et ceux-ci passeront à droite par tout «attrape tout» codé comme:

catch ( Exception e) ...  // doesn't really catch *all*, eh?

faites ceci à la place:

catch ( Throwable t) ...

Voir la réponse de Carlos Heuberger ci-dessous pour la partie laide.
mplwork

3

Les versions Java antérieures à la version 7 permettent ces trois combinaisons de try-catch-finally ...

try - catch
try - catch - finally
try - finally

finallyblock sera toujours exécuté, peu importe ce qui se passe dans le bloc tryor / and catch. donc s'il n'y a pas de catchbloc, l'exception ne sera pas gérée ici.

Cependant, vous aurez toujours besoin d'un gestionnaire d'exceptions quelque part dans votre code - à moins que vous ne souhaitiez que votre application plante complètement, bien sûr. Cela dépend de l'architecture de votre application exactement où se trouve ce gestionnaire.

  • Le bloc try Java doit être suivi soit par catch soit par finally.
  • Pour chaque bloc try, il peut y avoir zéro ou plusieurs blocs catch, mais un seul bloc finally.
  • Le bloc finally ne sera pas exécuté si le programme se termine (soit en appelant System.exit (), soit en provoquant une erreur fatale qui provoque l'abandon du processus).

1
"avant la version 7 autorise" êtes-vous en train de dire que Java 7 et Java 8 n'autorisent pas ces trois combinaisons? Je doute que ce soit ce que vous voulez dire, mais c'est ce que votre réponse implique.
Loduwijk

le bloc finally est-il exécuté s'il y a une instruction return dans le bloc try?
Rahul Yadav

@Rahul Oui, sera finalement appelé. Ref: stackoverflow.com/questions/65035/…
roottraveller

1
@Aaron - nouvelle syntaxe pour try-with-resource qui appelle automatiquement .close () sur tout ce qui est construit dans les parenthèses juste après le mot-clé try.
Roboprog

2

comment fonctionne le bloc try s'il rencontre une exception ou quoi que ce soit pouvant être jeté

L'exception est levée hors du bloc, comme dans tout autre cas où elle n'est pas interceptée.

Le bloc finally est exécuté indépendamment de la façon dont le bloc try est sorti - qu'il y ait ou non des captures, qu'il y ait ou non une capture correspondante.

Les blocs catch et le finally sont des parties orthogonales du bloc try. Vous pouvez avoir l'un ou les deux. Avec Java 7, vous ne pourrez avoir ni l'un ni l'autre!


1

N'essayez-vous pas avec ce programme? Il va enfin pouvoir bloquer et exécuter le bloc finally, mais l'exception ne sera pas gérée. Mais, cette exception peut être annulée dans le bloc finally!


1

Le bloc finally est exécuté une fois le bloc try terminé. Si quelque chose est jeté à l'intérieur du bloc try quand il quitte, le bloc finally est exécuté.


0

À l'intérieur du trybloc, nous écrivons des codes qui peuvent lever une exception. Le catchbloc est l'endroit où nous traitons l'exception. Le finallybloc est toujours exécuté, que l'exception se produise ou non.

Maintenant, si nous avons un bloc try-finally au lieu d'un bloc try-catch-finally, l'exception ne sera pas gérée et après que le bloc try au lieu du contrôle passe au bloc catch, il va enfin bloquer. Nous pouvons utiliser le bloc try-finally lorsque nous ne voulons rien faire avec l'exception.


0

Indépendamment de l'exception lancée ou non dans le trybloc, le finallybloc sera exécuté. L'exception ne serait pas interceptée.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.