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?
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?
Réponses:
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.
Une petite note sur try
/ finally
: Le finally s'exécutera toujours sauf si
System.exit()
est appelé.try{}
bloc ne se termine jamais (par exemple, une boucle sans fin).try{..} catch{ throw ..} finally{..}
? Je pense que finalement ne sera pas exécuté
La spécification du langage Java (1) décrit comment try-catch-finally
est 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é).
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 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) ...
Les versions Java antérieures à la version 7 permettent ces trois combinaisons de try-catch-finally ...
try - catch
try - catch - finally
try - finally
finally
block sera toujours exécuté, peu importe ce qui se passe dans le bloc try
or / and catch
. donc s'il n'y a pas de catch
bloc, 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).
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!
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!
À l'intérieur du try
bloc, nous écrivons des codes qui peuvent lever une exception. Le catch
bloc est l'endroit où nous traitons l'exception. Le finally
bloc 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.