Probleme avec JOptionPane.ShowInputDialog [Résolu]

cs_redbar 114 Messages postés mardi 26 janvier 2010Date d'inscription 26 mai 2014 Dernière intervention - 29 mars 2012 à 18:32 - Dernière réponse : cs_redbar 114 Messages postés mardi 26 janvier 2010Date d'inscription 26 mai 2014 Dernière intervention
- 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
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
cormandyr 600 Messages postés samedi 20 mai 2006Date d'inscription 8 juillet 2016 Dernière intervention - 30 mars 2012 à 09:53
3
Merci
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...

Merci cormandyr 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cormandyr
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 30 mars 2012 à 08:13
0
Merci
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é");
}
Commenter la réponse de cs_Julien39
Utilisateur anonyme - 30 mars 2012 à 10:28
0
Merci
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 /...
Commenter la réponse de Utilisateur anonyme
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 30 mars 2012 à 10:49
0
Merci
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);
}
Commenter la réponse de cs_Julien39
cs_redbar 114 Messages postés mardi 26 janvier 2010Date d'inscription 26 mai 2014 Dernière intervention - 30 mars 2012 à 14:24
0
Merci
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.
Commenter la réponse de cs_redbar
cormandyr 600 Messages postés samedi 20 mai 2006Date d'inscription 8 juillet 2016 Dernière intervention - 30 mars 2012 à 14:37
0
Merci
tu veux dire après la création du nouvel approvisionnement?
Commenter la réponse de cormandyr
cs_redbar 114 Messages postés mardi 26 janvier 2010Date d'inscription 26 mai 2014 Dernière intervention - 30 mars 2012 à 14:51
0
Merci
OUI exactement.
Commenter la réponse de cs_redbar
cormandyr 600 Messages postés samedi 20 mai 2006Date d'inscription 8 juillet 2016 Dernière intervention - 30 mars 2012 à 15:01
0
Merci
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...
Commenter la réponse de cormandyr
cs_redbar 114 Messages postés mardi 26 janvier 2010Date d'inscription 26 mai 2014 Dernière intervention - 30 mars 2012 à 15:27
0
Merci
ok merci .
et bonne fin de semaine
Commenter la réponse de cs_redbar
Utilisateur anonyme - 30 mars 2012 à 18:27
0
Merci
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 /...
Commenter la réponse de Utilisateur anonyme
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 30 mars 2012 à 19:43
0
Merci
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.
Commenter la réponse de cs_Julien39
Utilisateur anonyme - 1 avril 2012 à 02:21
0
Merci
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 /...
Commenter la réponse de Utilisateur anonyme
cs_redbar 114 Messages postés mardi 26 janvier 2010Date d'inscription 26 mai 2014 Dernière intervention - 2 avril 2012 à 11:11
0
Merci
Bonjour
Merci pour cette explication. Je comprend mieux et donc ce genre d'exception peuvent etre evité tout simplement.
merci
Commenter la réponse de cs_redbar

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.