Class Pile, exceptions

Résolu/Fermé
hedii Messages postés 39 Date d'inscription samedi 7 janvier 2012 Statut Membre Dernière intervention 19 juin 2013 - 11 juin 2013 à 20:36
 hedii - 12 juin 2013 à 20:40
Bonjour,

j'ai créé une clase pile avec des exceptions et voici un main de test:

package PileTest;
import java.util.Vector;
import tp2ex1.Pile;
import tp2ex1.PilePleineException;
import tp2ex1.PileVideException;
/**
*
* @author FOUFA
*/
public class PileTest {

public static void main(String[] args) {

Pile pile = new Pile();

Object pile1=1;
Object pile2=2;

try {
pile.empiler(pile1);
pile.empiler(pile2);
pile.depiler();
}

catch (PileVideException v) {
System.out.println("La pile est vide"+v);
}

catch (PilePleineException p) {
System.out.println("La pile est pleine");
}

}
}


-Est-ce correct ?
-Puis je faire un autre try (pour empiler un nombre infni d'object) si non, ou le faire ?
-Comment creer un nombre infini d'objects (tres grand) ?
Merci ! (en attente de tksteph ^^)

8 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 juin 2013 à 20:44
L'exception "pile pleine" ne devrait pas être gérée. Par définition une pile n'a pas de limite, si tu en as une alors ce n'est pas une pile.
Éventuellement, avec une "infinité" d'objets tu auras une OutOfMemoryError qui sera directement générée par la machine virtuelle, mais ce ne sera pas forcément sur l'instruction empiler, donc ce deuxième catch ne sers à rien.

La seule exception à gérer tu l'as déjà faite c'est PileVide.

(tksteph est absent pour le moment mais vous pouvez lui laisser un message ^^)
1
hedii Messages postés 39 Date d'inscription samedi 7 janvier 2012 Statut Membre Dernière intervention 19 juin 2013
11 juin 2013 à 22:02
Bonjour, merci pour votre reponse,

je l'ai rajouté (exception pilepleine) car sinon j'ai une erreur aux lignes ou j'empile

et comment faire pour faire un autre try ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 juin 2013 à 22:07
"j'ai une erreur aux lignes ou j'empile"
Ce n'est pas normal, ta pile doit être extensible autant que nécessaire.

"comment faire pour faire un autre try ?"
Je ne vois pas pourquoi tu aurais besoin d'un autre try, mais tu peux les imbriquer comme n'importe quelle autre structure conditionnelle.

try
{
    try
    {
    }
    catch ()
    {
    }
}
catch ()
{
    try
    {
    }
    catch ()
    {
    }
}
0
hedii Messages postés 39 Date d'inscription samedi 7 janvier 2012 Statut Membre Dernière intervention 19 juin 2013
Modifié par hedii le 11/06/2013 à 22:17
Ce serait un try pour tester l'exception pile pleine en empilant l'infinité d'objets. On a defini un maxPile a 10.
Merci KX
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 juin 2013 à 22:21
Je ne vois toujours pas où est le problème...

Tu pourrais faire :

try
{
    while (true)
        pile.empiler(new Object()); 
}
catch (PilePleineException e)
{ 
    e.printStackTrace();
    System.exit(1);
}

ou encore :

while (true)
{
    try
    {
        pile.empiler(new Object()); 
    }
    catch (PilePleineException e)
    { 
        e.printStackTrace();
        System.exit(1);
    }
}

Mais il n'y a qu'un seul try, pas deux... Et j'insiste, l'exception PilePleine ne devrait pas exister !
0
tksteph Messages postés 204 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 3 janvier 2018 25
11 juin 2013 à 22:23
Salut,

syntaxiquement ton code n'as pas de problème ,
Par contre il ya quelques petits éléments à redire conceptuellement (On y reviendra).

Comme précisé précédement (par KX) Par définition une pile n'a pas de limite, si tu en as une alors ce n'est pas une pile Alors le tout dépend de ce que tu as comme implémentation de Pile dans ta classe Pile (Celle tu package tp2ex1).

Si effectivement ta Classe Pile a une limite, alors oui tu as le droit de traiter l'exception Pile pleine,
Si par contre elle n'a pas de limite alors Non pas la peine de la traiter

Puis je faire un autre try (pour empiler un nombre infni d'object) si non, ou le faire ?

A priori, dans la définition même du bloc try{}catch(){}
tu peux faire dans un même programme autant que possible,
L'idée c'est de mettre toutes les instructions succeptible de générer des erreurs dans ces blocs (Donc tu peux t'amuser à mettre chaque instruction dans un bloc).

Mais l'idée d'une bonne conception/programmation c'est justement de regrouper ces instructions dans un seul bloc try, avec plusieurs catch permettant alors de distinguer/Personnaliser la gestion des erreurs (Comme ce que t'as fait. C déja bien!)

Mais attention!! (Pour revenir à ton code)
Puisque tu attrapes les Exceptions de type PileVide et PilePleine, Il faut que dans ta classe pile que les méthodes empiler(Object o){} et depiler(){} popagent ces exceptions (Sinon il ne sert à rien de les attraper à l'exterieur)

Comment creer un nombre infini d'objects (tres grand) ?
Peux tu reformuler?
Si non tu peux utiliser des Listes/ tableaux avec une taille "tres grande", Tables de hachages,...
J'espère avoir t'avoir apporté quelques éclaircissements,

Bon Courage!


0
tksteph Messages postés 204 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 3 janvier 2018 25
11 juin 2013 à 22:25
Désolé , mon msg arrive en retard,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hedii Messages postés 39 Date d'inscription samedi 7 janvier 2012 Statut Membre Dernière intervention 19 juin 2013
Modifié par hedii le 11/06/2013 à 22:29
Ah bah c'est bon ca marche ! Merci KX ! bonne soiree a bientot
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 juin 2013 à 22:31
C'est ce qu'expliquait tksteph :

Puisque tu attrapes les Exceptions de type PileVide et PilePleine, Il faut que dans ta classe pile que les méthodes empiler(Object o){} et depiler(){} popagent ces exceptions (Sinon il ne sert à rien de les attraper à l'exterieur)

Si tu n'as jamais d'erreur de type PilePleine (ce qui devrait être le cas), inutile de faire un try/catch dessus, et plus qu'être inutile c'est faux de faire un try/catch pour rien...
0
hedii Messages postés 39 Date d'inscription samedi 7 janvier 2012 Statut Membre Dernière intervention 19 juin 2013
11 juin 2013 à 22:33
on a bien un maxPile :) merci
0
hedii Messages postés 39 Date d'inscription samedi 7 janvier 2012 Statut Membre Dernière intervention 19 juin 2013
11 juin 2013 à 22:32
Bonjour tksteph,
il y avait bien un maximum d'objets, j'ai resolu le probleme de l'infinité d'objets avec le while de KX. Et pour les try c'est bien compri merci.

Merci pour votre reponse a bientot.
0
hedii Messages postés 39 Date d'inscription samedi 7 janvier 2012 Statut Membre Dernière intervention 19 juin 2013
Modifié par hedii le 12/06/2013 à 15:43
Bonjour,

dans les classes pilevideexception et pilepleineexception j'ai redefini les methodes toString:

public String toString() {
return "La pile est vide";
}

public String toString () {
return "Pile pleine, taille:"+Pile.getMaxPile()+",objet non ajouté:"+objet.toString();
}


J'essai maintant de les utiliser dans les catch du main de la class piletest:

public class PileTest {

public static void main(String[] args) {

Pile pile = new Pile();

Object pile1=1;

try {
pile.empiler(pile1);
pile.depiler();
pile.depiler();
}

catch (PileVideException v) {
System.out.println(pile.toString());
//utilise la methode toString redefinie dans PileVideException
}

catch (PilePleineException p) {
System.out.println(pile.toString());
//utilise la methode toString redefinie dans PilePleineException
}


try
{
while (true)
pile.empiler(new Object());
}
catch (PilePleineException p)
{
System.out.println(pile.toString());
}
}
}


Ma question est, comme cela, le toString du premier catch utilise la methode redefinie dans pilevideexception et celui du deuxieme celle de pilepleineexception ? Si non comment faire pour que ce soit le cas :).

Merci !
0
hedii Messages postés 39 Date d'inscription samedi 7 janvier 2012 Statut Membre Dernière intervention 19 juin 2013
12 juin 2013 à 15:54
J'ai corrigé le programme en faisant respectivement p et v.toString... cela suffit il ?
0
tksteph Messages postés 204 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 3 janvier 2018 25
12 juin 2013 à 17:12
ça peut se faire,
Mais t'as quoi comme résultat après tes tests.

NB: Il est bien de penser à tes tests à chaque fois que tu ecris tes codes:

Comment vais-je appeller tels classe? méthode?...
Quel résultat dois-je attendre..

Celà te permet de faire un code "propre" et sympa
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 juin 2013 à 17:16
Normalement, tu ne devrais pas surcharger la méthode toString des Exceptions sauf dans de très rares cas où elles possèdent des attributs, ce qui n'est pas ton cas.

La bonne manière de faire est d'appeler le super constructeur Exception(String message), voir même Exception(String message,Throwable cause), au cas où l'exception est dû à une autre exception que tu as géré.

public class PileVide extends Exception
{
    public PileVide()
    {
        super("La pile est vide");
    }
}

public class PilePleine extends Exception
{
    public PilePleine(int max, Object obj)
    {
        super("Pile pleine, taille:"+max+",objet non ajouté:"+obj);
    }
}
0
C'est corrigé, je vous montre les resultats si vous voulez ^^:

package tp2ex1;
import java.util.Vector;

/**
*
* @author FOUFA
*/
public class Pile extends Vector {
private static final int maxPile=10;
/**
*
*/
public Pile() {

}

static public int getMaxPile () {
return maxPile;
}
private boolean pileVide () {
if (this.isEmpty()) {
return true;
}
else {
return false;
}
}

private boolean pilePleine () {
if (this.size()>maxPile) {
return true;
}
else {
return false;
}
}

public void empiler (Object o) throws PilePleineException {
if (!pilePleine()) {
this.add(o);
}
else {
throw new PilePleineException (o);
}
}

public String depiler () throws PileVideException {
if (this.size()!=0){
this.remove(this.size()-1);
return "Element supprime:"+this.elementAt(this.size()-1);
}
else
{
throw new PileVideException ();
}
}

}


package tp2ex1;

/**
*
* @author FOUFA
*/
public class PilePleineException extends Exception {

private Object objet;

public PilePleineException (Object o){
this.objet=o;
}

public PilePleineException (String message){
super(message);
}

public String toString () {
return "Pile pleine, taille:"+Pile.getMaxPile()+",objet non ajoute:"+objet.toString();
}
}


package tp2ex1;
/**
*
* @author FOUFA
*/
public class PileVideException extends Exception {


public PileVideException (){

}

public PileVideException (String message){
super(message);
}

public String toString() {
return "La pile est vide";
}
}


package PileTest;
import java.util.Vector;
import tp2ex1.Pile;
import tp2ex1.PilePleineException;
import tp2ex1.PileVideException;
/**
*
* @author FOUFA
*/
public class PileTest {

public static void main(String[] args) {

Pile pile = new Pile();

Object pile1=1;

try {
pile.empiler(pile1);
pile.depiler();
pile.depiler();
}

catch (PileVideException v) {
System.out.println(v.toString()); //utilise la methode toString redefinie dans PileVideException
}

catch (PilePleineException p) {
System.out.println(p.toString()); //utilise la methode toString redefinie dans PilePleineException
}


try
{
while (true)
pile.empiler(new Object());
}
catch (PilePleineException p)
{
System.out.println(p.toString());
}
}
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 juin 2013 à 20:17
"class Pile extends Vector"

Si ta classe étend Vector, alors c'est un tableau, voire une liste, mais pas une pile !

if (this.isEmpty()) { 
return true; 
} 
else { 
return false; 
} 

Ce genre de test est absurde, this.isEmpty est déjà un booléen, tu peux le renvoyer immédiatement, mais la méthode complete est absurde, pourquoi aller utiliser la méthode pileVide (qui est private !!) alors que la classe Vector nous laisse déjà à disposition la méthode isEmpty qui est public...

ps. this.size()>maxPile est faux, ici tu as un max=10, ça veut dire que tu ne détecteras l'exception que la taille sera 11, alors que tu n'aurais jamais du mettre ce onzième élément !

Bref, je ne vais pas faire toutes les lignes, je l'ai déjà dit hier, ce que tu fais n'est pas une pile.

Je reviens juste sur les Exception, à croire que je parle dans le vide, on ne doit pas redéfinir la méthode toString d'une exception, elles ont un format standardisé qui s'héritent grâce à leur constructeur, tu ne peux pas mettre ce que tu veux, sinon ça brise l'intérêt des exceptions.
De plus conserver l'objet qui est en trop dans la pile est inutile, c'est la pile qui a planté, ce n'est pas la faute de cet objet, donc le stocker n'a aucun intérêt si ce n'est pour ton toString que tu ne devrais pas faire, alors que je t'ai montré comment faire sans !
0
On a corrigé ca comme ca en cours pour les exceptins au fait :s, et l'enoncé est un TP:s.
0