[Java] Exception et flux

Voir le sujet précédent Voir le sujet suivant Aller en bas

[Java] Exception et flux

Message  Nicky le Lun 31 Aoû 2009, 15:17

Voila voila question suivante.

Je pensais que le throws permettait de signaler une classe dangereuse en quelque sorte.
avec une erreur envoyé ensuite par throw dans le code. Erreur qui doit ensuite etre attraper par le try catch lors de l'utilisation de la classe.

Code:
public static void main(String[] args) throws IOException {
InputStream file = new FileInputStream("data");
int b;
while ((b=file.read())!=−1) {
System.out.print(b+" ");
}
file .close ();
}

Dans ce cas ci alors, a quoi sert le throws? uniquement un prevenir un autre programeurs que ce bout de code renvoie une erreur? (des erreurs)
mais rien n'est gerer. j'aurais donc pu me passé de se throws sans que ca ne change rien... oui / non?


EDIT: je crée assez de topic en ce moment alors jvais concentrer un maximum ici Very Happy

En ce qui concerne les flux , vu leur grand risque d'erreur on travaillera de préférence ...systématiquement dans un try catch . Le fichier devant etre absolument fermer on mettra la fil.close() plutot dans un finally plutot que de le placer apres chaque catch non? je demande psq dans des morceaux de code des slides le close est souvent placé dans chaque bloc catch..., je flipe, alors maintenant je vais poser la moindre question chose que j'aurais sans doute du faire en juin... !!!!

Nicky

Nombre de messages : 300
Age : 29
Prénom : Pierre
Statut : Tout fini ! 2012
Localisation : Bruxelles / Chimay
Date d'inscription : 18/03/2008

Revenir en haut Aller en bas

Re: [Java] Exception et flux

Message  Anthoblack le Lun 31 Aoû 2009, 17:06

Les méthodes de ton objet InputStream peuvent, elles aussi, jeter des erreurs... Si c'est le cas, ta méthode n'attrape pas l'erreur mais la renvoie à l'utilisateur de ta méthode. Tu auras pu "t'en passer" si tu attrapais l'erreur dans ta méthode... Sinon, non ! Il faut toujours spécifier comment tu traitres l'erreur (et donc ici dire que tu la traiteras "plus tard")

Sinon, quand tu catch (attrape) un erreur jetée, il vaut mieux ne pas mettre tout dans un seul try/catch afin de faciliter le débug... Et le catch doit être le plus précis possible dans le type d'erreur (pas object quoi Razz).
si .close() est une méthode pouvant lancer une erreur, elle devra être dans un try

Ici il faudra donc un try pour le .read(), le .close et la création aussi j'imagine...


J'espère t'avoir aidé Wink

Anthoblack

Nombre de messages : 764
Age : 28
Prénom : Anthony
Statut : Ex-étudiant
Localisation : Bruxelles
Date d'inscription : 11/03/2008

Revenir en haut Aller en bas

Re: [Java] Exception et flux

Message  Nicky le Lun 31 Aoû 2009, 17:45

Anthoblack a écrit:

J'espère t'avoir aidé Wink

oui oui ne t'inquiete pas pour ca merci Wink

donc le throws signal que je vais gerer une erreur comme je l'avais dit , si j'avais attrapper et gerer l'erreur le throws ici n'aurait pas été nécessaire, il reporte juste le probleme en soit dans ce cas?


EDIT: autant pour moi, en ce qui concerne le finally et le la méthode .close(); c 'est écrit en grand sur un des slides que le finally ne suffit xD

EDIT2 : il est mieux de gerer son exception dans la méthode ou class qui la genere, ou alors plutard... lorsque j'appel la méthode par exemple...

Nicky

Nombre de messages : 300
Age : 29
Prénom : Pierre
Statut : Tout fini ! 2012
Localisation : Bruxelles / Chimay
Date d'inscription : 18/03/2008

Revenir en haut Aller en bas

Re: [Java] Exception et flux

Message  SK le Lun 31 Aoû 2009, 18:05

Nicky a écrit:Je pensais que le throws permettait de signaler une classe dangereuse en quelque sorte.
avec une erreur envoyé ensuite par throw dans le code.
Il n'y a rien de dangereux ni d'explosif à utiliser des exceptions. Les exceptions sont à entendre dans le terme le plus proche du français... une exception. C'est pas spécialement méchant, c'est juste exceptionnel.
Le mot-clé throws après la signature ne fait que préciser que l'utilisation de cette fonction/méthode/constructeur pourrait être interrompu à cause d'un cas exceptionnel justement ("ma fonction marche, sauf si tu fais ça."), et enverrait une exception du type indiqué.
Ensuite en tant qu'utilisateur de ta classe, je peux vérifier dans la javadoc dans quels cas ça foire, et choisir quoi faire (afficher un message, ne rien faire, envoyer l'exception plus loin ...).
Dans ton cas tu dois gérer des exceptions puisque tu utilises le constructeur de FileInputStream(String), qui pourrait foirer if the file does not exist, is a directory rather than a regular file, or for some other reason cannot be opened for reading (voir javadoc). En plus de ça, tu utilises read et close qui ont des exceptions similaires.

Nicky a écrit:Erreur qui doit ensuite etre attraper par le try catch lors de l'utilisation de la classe.
Tu as bien compris, mais dans ton exercice ici cependant écrire throws dans le main ne me semble pas utile puisque personne ne va vraiment pouvoir le réutiliser avec un try-catch. De façon générale, évite de décorer la signature du main.

Nicky a écrit:Dans ce cas ci alors, a quoi sert le throws? uniquement un prevenir un autre programeurs que ce bout de code renvoie une erreur?
mais rien n'est gerer. j'aurais donc pu me passé de se throws sans que ca ne change rien... oui / non?
Rien n'est géré, justement. A ta place je le ferai. Dans la javadoc tu verras qu'un FileInputStream peut foirer son ouverture et sa lecture: fichier pas là, c'est un dossier, pas d'accès, etc. D'ailleurs tu pourras voir par la même occasion que c'est carrément rare parmi les classes existantes de trouver des méthodes/constructeurs sans exceptions.

Si FileInputStream foire, il te balance in IOException dans ton code. Si ton code n'a pas de try-catch autour, c'est ta fonction qui envoit cette même IOException "plus loin", et ce serait à un autre utilisateur de mettre try-catch autour de ta fonction à toi. Cependant je te conseille vivement d'entourer directement tout code susceptible de lancer une exception (ici je parle du new FileInputStream("data") + read + close). Je ferai comme cela:

Code:
public static void main(String args) throws IOException {
try { // j'essaie le code et je croise les doigts
    InputStream file = new FileInputStream("data");
    int b;
    while ((b=file.read())!=-1)
        System.out.print(b+" ");
    file.close ();
        } catch (IOException ex) { // mais si ça foire, je prévois le coup.
        System.out.println("Une erreur est survenue lors d'une manipulation du fichier.") ;
        }
    }
}

Note que je suis fainéant et pour l'exercice mon try englobe d'un coup tout ce qui fait exception de type IOException.

Nicky a écrit:Le fichier devant etre absolument fermer on mettra la fil.close() plutot dans un finally plutot que de le placer apres chaque catch non?
Non parce que alors si le fichier n'existe pas... tu vas fermer un fichier qui n'existe pas... Je mettrai cela plutôt à la fin du try, mais peut-être que je joue avec du feu, ce ne sont pas les rayons de soleils qui améliorent ma concentration en tout cas.

Bonne chance.


PS: Javadoc (les balises [url] n'ont pas l'air de marcher bien): http://www.j2ee.me/javase/6/docs/api/java/io/FileInputStream.html#FileInputStream(java.lang.String)


Dernière édition par SK le Lun 31 Aoû 2009, 18:07, édité 1 fois

SK

Nombre de messages : 221
Age : 29
Prénom : Sébastien
Statut : ancien
Localisation : Braine-l'Alleud
Date d'inscription : 12/12/2006

Revenir en haut Aller en bas

Re: [Java] Exception et flux

Message  SK le Lun 31 Aoû 2009, 18:07

*lit le post d'antho*

oui voilà Smile

SK

Nombre de messages : 221
Age : 29
Prénom : Sébastien
Statut : ancien
Localisation : Braine-l'Alleud
Date d'inscription : 12/12/2006

Revenir en haut Aller en bas

Re: [Java] Exception et flux

Message  Nicky le Lun 31 Aoû 2009, 18:15

oula merci pour la brik et d'avoir passé du temps la dessus.

tu m'éclaires également et je crois que sur mon prochain doute je viendrais relire ce topic Wink ...

Sur ce encore un ou 2tests puis jcrois que jvais vraiment devoir sortir me défouler ... HAAAAAAAAAA...

EDIT: le faite de tout mettre dans un try et de faire un IOException n'est pas un peu une solution de facilité?
J'ai une perte de précision sur mon erreur, j'imagine qu'il serait mieux de faire différent bloc pour l'ouverture, la lecture,et la fermeture... mais tout s complique Smile

Nicky

Nombre de messages : 300
Age : 29
Prénom : Pierre
Statut : Tout fini ! 2012
Localisation : Bruxelles / Chimay
Date d'inscription : 18/03/2008

Revenir en haut Aller en bas

Re: [Java] Exception et flux

Message  Nicky le Mar 01 Sep 2009, 19:31

Hop encore un commentaire. Cours de java Slide 622

ECRITURE DANS UN FICHIER BINAIRE
◮ Création du fichier lors de l’instanciation
◮ Si le fichier existe, son contenu est remplacé
◮ Seul l’octet de poids faible est écrit
◮ Pas de FileNotFoundException

heu j'ai fais pas mal de test et j'ai l'impression que le fichier ne se crée pas à l'instanciation si absent, donc j'ai belle et bien un FileNotFoundException, mais par contre il se crée lors du .write(int b); qui lui aussi doit etre encadrer car retourne un IOException...

J'ai raison/ tord? ou je m'y prend peu etre mal... soit si j'ai raison le slide est a modifier Very Happy Twisted Evil

Nicky

Nombre de messages : 300
Age : 29
Prénom : Pierre
Statut : Tout fini ! 2012
Localisation : Bruxelles / Chimay
Date d'inscription : 18/03/2008

Revenir en haut Aller en bas

Re: [Java] Exception et flux

Message  SK le Mer 02 Sep 2009, 12:25

Nicky a écrit:Hop encore un commentaire. Cours de java Slide 622

ECRITURE DANS UN FICHIER BINAIRE
◮ Création du fichier lors de l’instanciation
◮ Si le fichier existe, son contenu est remplacé
◮ Seul l’octet de poids faible est écrit
◮ Pas de FileNotFoundException

heu j'ai fais pas mal de test et j'ai l'impression que le fichier ne se crée pas à l'instanciation si absent, donc j'ai belle et bien un FileNotFoundException, mais par contre il se crée lors du .write(int b); qui lui aussi doit etre encadrer car retourne un IOException...

Je ne suis pas sûr d'avoir saisi ton problème. Tu veux dire que même quand l'instanciation de ton objet foire (exception), tu peux tout de même faire un .write de ce même objet par après?
Vous utilisez FileOutputStream?

Nicky a écrit:soit si j'ai raison le slide est a modifier Very Happy Twisted Evil
J'ai souvent eu cet impression et je me suis souvent fait avoir. Mais bon, les slides ne sont pas tellement + qu'une soupe de mot-clés, pour cela qu'il faut pas prendre à la lettre ce qui y est noté.
"Ce n'est qu'un aide-mémoire pour le prof et non un support du cours, bla bla bla... vos propres notes bla bla...", c'est barbant mais c'est véridique Wink

SK

Nombre de messages : 221
Age : 29
Prénom : Sébastien
Statut : ancien
Localisation : Braine-l'Alleud
Date d'inscription : 12/12/2006

Revenir en haut Aller en bas

Re: [Java] Exception et flux

Message  Nicky le Mer 02 Sep 2009, 16:51

ok bon pendant que je redigeais ma réponse, j'ai remarquer que ...

*suspens*
...

je m'étais planter... ouai bon ca arrive Smile


Enfaite meme si il crée lui meme le fichier "7445" il faut quand meme l'encadrer dans un try catch ou mettre un throws FileNotFoundException... (j'avais surement pas remis le throws lors du test , du coup, erreur... )
Code:

FileOutputStream fos = new FileOutputStream("7445");

le truc vu qu'il crée lui meme le fichier, il le trouvera a tout les coups? pourquoi donc devoir reporter l'erreur éventuel?


...

réfléchi...


au cas ou il n'aurait pas les droits en écriture!


bon Sk je me suis planter dsl de t'avoir fais perdre ton temps.
Au moins je ne reste pas sur une erreur Very Happy

Nicky

Nombre de messages : 300
Age : 29
Prénom : Pierre
Statut : Tout fini ! 2012
Localisation : Bruxelles / Chimay
Date d'inscription : 18/03/2008

Revenir en haut Aller en bas

Re: [Java] Exception et flux

Message  Contenu sponsorisé Aujourd'hui à 14:32


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum