salut tout le monde !
jaimerai savoir a quoi sert exactement Try et Catch..
merci
salut tout le monde !
jaimerai savoir a quoi sert exactement Try et Catch..
merci
Salut,
A traiter les exceptions.
Un début d'explication dans la FAQ
mais ils vont toujours ensemble non ?
Pas forcément.
On peut avoir un try avec plusieurs catch.
On peut aussi avoir un try sans catch mais avec finally.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 try { ... } catch (Exception1 e1) { ... } catch (Exception2 e2) { ... }
Par contre, il est vrai qu'on a jamais de catch sans try !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 try { ... } finally { ... }
cest quoi la différence entre catch et finally ? try veut dire essaie et catch prend... c'est juste comme je vois les chose ?
Alors, tu dois placer le code qui peut générer une erreur "throws ...Exception" et utiliser le bloc catch pour exécuter du code en fonction de l'exception lancé...
Le bloc finally existe bien, il sert à executer une partie de code, que l'exception soti lancé ou non.
Mais en fait, il est totalement inutil : si tu place ton code après la balise catch il sera toujours exécuté...
Par ex :
As-tu besoin de plus de précisions ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 try { String[] str = {"str1", "str2"}; String str2 = str[ str.length+1 ]; // lance une exception System.out.println("cela n'est pas interprete..."); } catch (IndexArrayOutOfBoundsException e) { System.out.println("cela est interprete,car l'exception a ete lance"); } System.out.println("dans tous les cas, on affiche ca");
Salut,
Non le bloc finally n'est pas totalement inutile !Envoyé par jak0
Comme tu l'as dit il est exécuté dans tous les cas, y compris :
- Si une exception du bloc try/catch n'est pas attrapé.
- S'il y a un return dans le bloc try/catch
C'est très avantageux car cela permet de mieux traiter les cas d'erreurs en n'utilisant qu'un seul code pour la fermeture (en particulier si tu veux renvoyer l'exception à la méthode appellante...
Exemple pour l'ouverture d'un flux :
Les exception ne sont pas traité mais renvoyé à la méthode appellante (throws IOException) mais quoi qu'il arrive le flux sera bien fermé...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public void readFile() throws IOException { InputStream input = null; try { input = new FileInputStream("..."); // plusieurs acces au fichier } finally { if (input!=null) { input.close(); } } }
a++
NON
Code : Sélectionner tout - Visualiser dans une fenêtre à part Mais en fait, il est totalement inutil![]()
Dans ton cas si tu as une NullPointerException ou tout autre exception non-catchee dans le code, les lignes situees apres le block catch ne seront JAMAIS executees car tu n'attrape que des IndexArrayOutOfBoundsException.
Avec finally elle seront TOUJOURS executees.
Merci de penser au tagquand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
On est d'accord sur le fait que :
- Le code se trouvant dans le bloc finally s'exécute quoi qu'il arrive.
Quand est-il du code se trouvant après le bloc try-catch-finally ?????
En catchant Exception, je catch tout donc pas de probleme avec ton nullpointerexception. Le code4 se toujours executé, a mois bien sur d'une grosse exception, genre OutOfMemoryError, mais là, c'est pas dis que le finally soit itnerpreté aussi...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 try { code1... } catch (Exception e) { code2... } finally { code3... } code4..
Sans utiliser le catch général, tu dois pouvoir utiliser les catch de toutes les éventuelles exceptions lancés... Et je pense que le but de la progra est dévité les exceptions, pas de les traiter, ceci nest utile que dans certains cas. Enfin ca, ca nengage que moi...
Et je sais ce que c'est que de catcher telle ou telle exception. C'est lexemple qui est important pas les variantes choisies.Envoyé par bouye
Toutefois tu as raison sur le principe, mais je pense quand meme, que si des exceptions sont lancés sans que tu les ai catchés, c'est que ta pas fait ton boulo.
Oui, même dans ce cas le finally sera interprété...Envoyé par jak0
Cela dépend de l'exception...Envoyé par jak0
Bien sûr les exceptions/erreurs dû à une mauvaise exécution du programme sont à éviter (style NullPointerException, ArrayIndexOutOfBoundException, StackOverflowError, etc...)
Mais il y a un grand nombre d'erreur qu'il faut traiter à un moment ou à un autre dans ton application, en particulier tout ce qui concerne les données utilisateurs et les flux de lecture/écriture (fichier, réseaux, etc...). Car dans ce cas l'erreur n'est pas prévisible ni évitable...
Le bloc finally est prévu pour fermet tous les flux et libérer les eventuelles ressources. C'est très important en particulier pour les applications serveurs...
Le bloc finally n'a aucun impact sur le code qui le suit... Ce dernier sera exécuté ou non selon ce que tu fais dans ton bloc try/catch (sauf bien sûr en cas d'exception dans le bloc finally)...Envoyé par jak0
ok... lol c'est claire là...
une petite participation supp :
personnellement, comme dit précédemment je trouve l'utilisation de try {} catch {} extrement utile.
J'ajoute que ces blocs s'utilisent aussi pour gagner du temps (en programmation et en exécution du prgramme pour gérer des erreurs "inattendues", dues à l'utilisation du programme. L'exemple le plus basique et le plus démonstratif reste la division par 0. Tu le gères en 2 lignes avec try{} et catch sans test de valeur..., alors que la programmation permettant d'éviter cette exceptions te prend plus de 2 lignes et au moins 1 test de la valeur posant problème dans l'application...
Donc c'est aussi dans la plupart des cas un gain de temps que de l'utiliser !
Je suis tout à fait d'accord quant à l'utilité des try catch, ce que je remet en cause c'est le finally, c'est tout...
Le finally te permet d'executer du code que le bloc try s'exécute bien ou mal.
L'exemple de adiGuba où le finally sert à être sûr de fermer un stream est typique.
Sans ce bloc finally, certains postent sur ce forum pour demander pourquoi ils n'arrivent pas à faire file.delete(). Finally n'est donc pas un gadget inutile !
Ca empeche pas, que ton truc tu peut le fermé après le bloc try catch, tout simplement après...
Oui mais si tu recois une exception imprévu, tu peux te retrouver avec des resources toujours ouvertes, et dans le cas d'une application serveur cela peut vite poser problème... (Si le thread de traitement d'un client plante le problème est limité, mais si on ne peut plus ouvrir de ressources car on a atteint la limite c'est plus grave car du coup l'erreur touche à tous les utilisateurs).Envoyé par jak0
Ensuite si ta méthode doit laisser remonter les exceptions tu te retrouves avec une gestion complexe, où tu dois attraper les exceptions, pour fermer les flux et les remonter, alors qu'un simple finally suffit... Et c'est d'autant plus vrai si tu as plusieurs types d'exceptions différentes que tu dois gérer différement...
De plus si je ne me trompe pas le bloc finally est apparu avec Java 1.2, et étant donné que Sun souhaite modifier le moins possible le langage (les nouvelles possibilitées de Java 5.0 étaient demandé depuis plusieurs années déjà...), si il a été ajouté c'est qu'il propose une solution a un grand nombre de problème...
Enfin ce n'est pas parce que tu ne l'utilises pas que c'est forcément inutile...
a++
C'est pas faux lol.Envoyé par "adiGuba
C'est vrai que pour ca, c'est utile, je me soumet. a++
Partager