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?
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.
Une petite note sur try
/finally
: Le finally sera toujours exécuté à moins que
System.exit()
est appelé.try{}
le bloc ne se termine jamais (par exemple, une boucle sans fin).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é).
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
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) ...
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).
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!).
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!
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é.