web-dev-qa-db-fra.com

Java Try Catch Finally bloque sans Catch

Je suis en train de revoir un nouveau code. Le programme a un essai et un bloc final seulement. Puisque le bloc catch est exclu, comment fonctionne le bloc try s'il rencontre une exception ou quoi que ce soit jetable? Est-ce juste aller directement au bloc finally?

116
NullPointer0x00

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

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

122
duffymo

Une petite note sur try/finally: Le finally sera toujours exécuté à moins que

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

La spécification du langage Java (1) décrit comment try-catch-finally est exécuté. Ne pas avoir de capture équivaut à ne pas avoir une capture capable d'attraper le Throwable donné.

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

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

36
Carlos Heuberger

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
14
skipchaser

Le bloc finally est toujours exécuté après la fin du bloc try, que try 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, la méthode actuelle relance simplement (ou continue de lancer) la même exception (après l'exécution du bloc finally).

Si le bloc finally génère une exception/erreur/jetable, et qu’il existe déjà un jetable en attente, il devient moche. Franchement, j'oublie exactement ce qui se passe (tant pour ma certification il y a des années). Je pense les deux jetables sont liés, 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 original avant le "enfin" barfed, heu, vomi.

Incidemment, essayer/finally est une chose assez courante à faire pour la gestion des ressources, car Java ne possède pas de destructeurs.

Par exemple. -

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

"Enfin", un autre conseil: si vous faites prenez la peine de capturer une capture, attrapez des sous-classes jetables spécifiques (attendues) ou attrapez simplement "Jetable", non " Exception ", pour un piège d'erreur général fourre-tout. Trop de problèmes, tels que les gaffes de réflexion, lancent des "erreurs" plutôt que des "exceptions", et ceux-ci vont passer à côté de tout "attraper tout" codé comme:

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

faites ceci à la place:

catch ( Throwable t) ...
6
Roboprog

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

try - catch
try - catch - finally
try - finally

Le bloc finally sera toujours exécuté quel que soit le déroulement du bloc try ou/et catch. donc s'il n'y a pas de bloc catch, l'exception ne sera pas traité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 et de l'emplacement exact de ce gestionnaire.

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

comment fonctionne le bloc try s'il rencontre une exception ou quoi que ce soit jetable

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

Le bloc finally est exécuté quelle que soit la façon dont le bloc try est quitté, qu'il y ait ou non des captures, qu'il y ait ou non des captures correspondantes.

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

2
Andy Thomas

N'essayez-vous pas avec ce programme? Il va enfin 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
Abimaran Kugathasan

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é.

1
mP.