Probleme avec JOptionPane.ShowInputDialog

Résolu
cs_redbar Messages postés 112 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 26 mai 2014 - 29 mars 2012 à 18:32
cs_redbar Messages postés 112 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 26 mai 2014 - 2 avril 2012 à 11:11
Bonjour
Je viens vers vous pour demander de l'aide.
J'ai écrit un code avec une boite de dialogue de saisie qui fonctionne en partie.
Quand je click sur le bouton ok de la boite ça fonctionne bien mais quand je click sur le bouton annuler il y a une exception du type NullPointerException qui est levée.
Et donc je cherche à éviter cette Exception mais je n'y arrive pas.
voici mon code :
String str    ="";
String strRef = "";
while(str.isEmpty()){
str = JOptionPane.showInputDialog(null, "Saisissez la désignation du produit" ,"Midas Touch Inc.",JOptionPane.INFORMATION_MESSAGE);
str = str.toLowerCase();
str = str.trim();
}

strRef= "%"+str+"%";

if (new SelectionBD().testResultatRechercheProduit(strRef)==true){

Approvisionnement approvision = new Approvisionnement(strRef);

}else{					
JOptionPane.showMessageDialog(null, "Ce produit n'existe pas dans la base.\n" +
"Voulez-vous le créer?", "Gestion de stock - Midas Touch Inc.", JOptionPane.ERROR_MESSAGE);
}	


Merci pour votre aide

13 réponses

cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
30 mars 2012 à 09:53
Salut, cela ne changera rien...

La [http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/JOptionPane.html#showInputDialog%28java.awt.Component,%20java.lang.Object,%20java.lang.String,%20int,%20javax.swing.Icon,%20java.lang.Object[ ,%20java.lang.Object%29]javadoc] te dis pourquoi tu as cette exception...

Si l'utilisateur clique sur cancel (ou un bouton du même type), la méthode renvoie null... Autrement dis, avec le code de Julien39, tu passes les premières opérations, mais l'exception sera lancée lors de la vérification de la condition de boucle...

je te conseillerai plutôt:
String strRef = null;
do {
    strRef = JOptionPane.showInputDialog(null, "Saisissez la désignation du produit" ,"Midas Touch Inc.", JOptionPane.INFORMATION_MESSAGE);
    if(strRef !=null){
        strRef = strRef .toLowerCase();
strRef = strRef .trim();
    } else {
        System.out.println("Bouton annulé");
    }
} while(strRef != null);


@Julien39 String.isEmpty() vérifie si la longueur de la String == 0...
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
30 mars 2012 à 08:13
Salut,

str.isEmpty : je ne connais pas cette méthode...

Mais, pour t'en sortir, tu peux tester si le resultat du JOPtionPane est différent de null :

		str = JOptionPane.showInputDialog(null, "Saisissez la désignation du produit" ,"Midas Touch Inc.",JOptionPane.INFORMATION_MESSAGE);
if(str!=null){
str = str.toLowerCase();
str = str.trim();
}
else {
System.out.println("Bouton annulé");
}
0
Utilisateur anonyme
30 mars 2012 à 10:28
Salut,

Si on clique sur le bouton Annuler, str a une longueur nulle.
Si on clique sur le bouton OK sans saisir, str a une longueur 0 (zéro).

          try
            {
               int longueurSaisie str.length(); // si  longueur null si pas de saisie long. 0
            }
               catch (NullPointerException npe)
               {
                  System.out.println("Sortie par clique du bouton Annuler");
                  System.exit(0);
               }


Cordialement,

...\ Dan /...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
30 mars 2012 à 10:49
Surtout pas. Il ne faut pas catcher les NullPointerException (c'est une RuntimeException). cormandyr a raison au sujet de ma réponse.

String str    = null;
String strRef = "";
while(str==null || str.isEmpty()){
str = JOptionPane.showInputDialog(null, "Saisissez la désignation du produit" ,"Midas Touch Inc.",JOptionPane.INFORMATION_MESSAGE);
if(str!=null){
str = str.toLowerCase();
str = str.trim();
}
}
strRef= "%"+str+"%";

if (new SelectionBD().testResultatRechercheProduit(strRef)==true){
Approvisionnement approvision = new Approvisionnement(strRef);
}else{					
JOptionPane.showMessageDialog(null, "Ce produit n'existe pas dans la base.\n" +
"Voulez-vous le créer?", "Gestion de stock - Midas Touch Inc.", JOptionPane.ERROR_MESSAGE);
}
0

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

Posez votre question
cs_redbar Messages postés 112 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 26 mai 2014
30 mars 2012 à 14:24
Bonjour
merci pour vos reponses. J'ai revu mon code avec vos indications et ça marche bien.
Voici donc le code que j'ai produit.
                     String str   ="";
String strRef = "";

do{	
str = JOptionPane.showInputDialog(null, "Saisissez la désignation du produit" ,"Midas Touch Inc.",JOptionPane.INFORMATION_MESSAGE);
if(str!=null){
str = str.toLowerCase();
str = str.trim();
int tr = str.length();

if(tr>0){
strRef= "%"+str+"%";
if (new SelectionBD().testResultatRechercheProduit(strRef)==true){
Approvisionnement approvision = new Approvisionnement(strRef);
}else{					
JOptionPane.showMessageDialog(null, "Ce produit n'existe pas dans la base.\n" +
"Voulez-vous le créer?", "Gestion de stock - Midas Touch Inc.", JOptionPane.ERROR_MESSAGE);
}
}

}else {
System.out.println("Bouton annuler ...");
}
}while(str!=null);

Mais une question me reviens:
lorsque je saisie des données dans ma boite de saisie et que les données sont dans la base le formulaire d'approvisionnement apparait bien sans problème. Mais quand je ferme le formulaire, la boite de dialogue de saisie apparait à nouveau. Puis- je empêcher la boite de réapparaitre? car je veux que la boite n'apparait plus.
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
30 mars 2012 à 14:37
tu veux dire après la création du nouvel approvisionnement?
0
cs_redbar Messages postés 112 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 26 mai 2014
30 mars 2012 à 14:51
OUI exactement.
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
30 mars 2012 à 15:01
comme ça, je dirais de betement mettre un break; apres cette ligne...
mais je pense que tu devrais plutot sortir le traitement du nom de la boucle..;

une fois le nom donné, as-tu encore besoin de le demander? si ce n'est pas le cas, le traitement d'un nom peut se faire en dehors...
0
cs_redbar Messages postés 112 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 26 mai 2014
30 mars 2012 à 15:27
ok merci .
et bonne fin de semaine
0
Utilisateur anonyme
30 mars 2012 à 18:27
Salut,

@ Julien39

"Surtout pas. Il ne faut pas catcher les NullPointerException (c'est une RuntimeException)."

Ceci demande à être développé non ?
Annuler ne veut-il pas dire qu'on abandonne ?


...\ Dan /...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
30 mars 2012 à 19:43
Pour la petite explication : les RuntimeException sont levées par des erreurs de codage : NullPointer, IndexOutOfBounds, ...

Il ne faut donc pas les catcher mais éviter qu'elles soient levées.

Le code que tu as donné fonctionne mais ce n'est pas terrible de catcher ce genre d'exception, et ces catch peuvent parfois t'empêcher de récupérer la trace réelle de l'erreur imagine ce code :

private void verifier(String str){
   //Admettons que tu vais un traitement sur str
   String a = null;
   a.toLowerCase();//Voilà une erreur de codage
]

public void methode(){
   try{
      String res = JOptionPane.showInput...
      verifier(res);
   }
   catch(NullPointerException e){
      System.out.println("Operation annulée");
   }
}


Le catch de NullPointerException t’empêchera de comprendre que tu as fais une erreur dans ta méthode verifier.

Là, l'exemple est très basique mais imagine ca sur plusieurs méthodes plus complexes qui appellent chacune plusieurs autres méthodes. Résultat : tu ne peux pas t'en sortir en catchant ce type d'exception.
0
Utilisateur anonyme
1 avril 2012 à 02:21
Re,

Bien entendu je suis convaincu de l'intérêt de ne pas catcher les RuntimeException surtout à cause de la sortie brutale du programme si par exemple les closes éventuelles ne sont pas dans des bloc finally


...\ Dan /...
0
cs_redbar Messages postés 112 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 26 mai 2014
2 avril 2012 à 11:11
Bonjour
Merci pour cette explication. Je comprend mieux et donc ce genre d'exception peuvent etre evité tout simplement.
merci
0
Rejoignez-nous