2016-02-28 1 views
0

Donc, mon programme demande à l'utilisateur d'entrer deux entiers, puis si l'utilisateur entre une chaîne, il affichera un message d'erreur "Invalide! Veuillez entrer un entier". Mais après que le message d'erreur apparaît, il affiche une erreur.Utiliser NumberFormatException dans JTextField

C'est l'erreur mais je réussi à convertir le JTextField en chaîne puis en entier

Exception in thread "main" java.lang.NumberFormatException: For input string: "a" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:580) 
at java.lang.Integer.parseInt(Integer.java:615) 
at SimpleCalculator1.main(SimpleCalculator1.java:52) 

Et ceci est mon code

import javax.swing.*; 
public class SimpleCalculator1 
{ 

     public static void main(String [] args) 
     { 
       int error1, error2; 
       JTextField field1 = new JTextField(); 
       JTextField field2 = new JTextField(); 
       JTextField field3 = new JTextField(); 
       Object[] message = 
        { 
         "Enter first integer:", field1, 
         "Input second integer:", field2, 
         "Choose the operation to be used\nAddition(+)\nSubtraction(-)\nMultiplication(*)\nDivision(/):", field3, 
        }; 
      int option = JOptionPane.showConfirmDialog(null, message, "SimpleCalculator", JOptionPane.OK_CANCEL_OPTION); 
      boolean shouldExit = false; 
      while(!shouldexit) 
        { 
         if(option == JOptionPane.OK_OPTION) 
         { 
           String value1 = field1.getText(); 
           String value2 = field2.getText();   
           String operation = field3.getText(); 

           try 
            { 
             int num1 = Integer.parseInt(value1); 
             int num2 = Integer.parseInt(value2); 
            } 
           catch(NumberFormatException ne) 
            { 
             JOptionPane.showConfirmDialog(null,"Invalid! Please input an integer","Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); //When I press ok, I need help to bring me back to input entries 
            } 

           switch(operation = field3.getText()) 
            { 
             case "+": 
             case "Addition": 
              { 
                int num1 = Integer.parseInt(value1); 
                int num2 = Integer.parseInt(value2); 
                int result = num1+num2; 
                JOptionPane.showMessageDialog(null,"The sum is: "+result); 
                break; 
              } 
             case "-": 
             case "Subtraction": 
              { 
                int num1 = Integer.parseInt(value1); 
                int num2 = Integer.parseInt(value2); 
                int result = num1-num2; 
                JOptionPane.showMessageDialog(null,"The difference is: "+result); 
                break; 
               } 
             case "*": 
             case "Multiplication": 
               { 
                int num1 = Integer.parseInt(value1); 
                int num2 = Integer.parseInt(value2); 
                int result = num1*num2; 
                JOptionPane.showMessageDialog(null,"The product is: "+result); 
                break; 
               } 
             case "/": 
             case "Division": 
               { 
                int num1 = Integer.parseInt(value1); 
                int num2 = Integer.parseInt(value2); 
                double result = (double)num1/num2; 
                JOptionPane.showMessageDialog(null,"The quotient is: "+result); 
                break; 
               } 

             default: 
                error1 = JOptionPane.showConfirmDialog(null,"Invalid operation, please try again","Error",JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE); //I need help here for creating a loop that will take me back to the beginning. 
         } 
         option = JOptionPane.showConfirmDialog(null, message, "SimpleCalculator", JOptionPane.OK_CANCEL_OPTION); 

        } 
         else if (option == JOptionPane.CANCEL_OPTION||) 
         { 
           JOptionPane.showMessageDialog(null,"Thank you for using our program!"); 
           shouldExit = true; 
         } 


     } 
} 

Répondre

0

Même si vous attrapez NumberFormatException pour le champ 1 et afficher une erreur, vous continuez après la capture et essayez d'analyser un nombre de champ3, qui n'est pas encore susceptible d'être entré, puis vous essayez à nouveau d'analyser les champs 1 et 2 en tant que valeurs numériques. Étendez votre capture pour envelopper le processus des trois champs et forcer l'utilisateur à entrer à nouveau une valeur valide.

Déplacement de votre bloc catch pour inclure l'analyse de tous les champs de texte et de forcer l'utilisateur d'entrer une valeur correcte peut être fait en modifiant votre boucle while comme indiqué ici:

  boolean exit = false; 
     while(!exit) { 

      int option = JOptionPane.showConfirmDialog(null, message, "SimpleCalculator", JOptionPane.OK_CANCEL_OPTION); 

      if(option == JOptionPane.OK_OPTION) 
      { 
       String value1 = field1.getText(); 
       String value2 = field2.getText();   
       String operation = field3.getText(); 

       try{ 
         int num1 = Integer.parseInt(value1); 
         int num2 = Integer.parseInt(value2); 

         operation = field3.getText(); 
         if(operation != null){ 
          operation = operation.toLowerCase(); 
         } 

         switch(operation) { 
           case "+": 
           case "addition": 

              num1 = Integer.parseInt(value1); 
              num2 = Integer.parseInt(value2); 
              int result = num1+num2; 
              JOptionPane.showMessageDialog(null,"The sum is: "+result); 
              break; 

           case "-": 
           case "subtraction": 

              num1 = Integer.parseInt(value1); 
              num2 = Integer.parseInt(value2); 
              int result = num1-num2; 
              JOptionPane.showMessageDialog(null,"The difference is: "+result); 
              break; 

           case "*": 
           case "multiplication": 

              num1 = Integer.parseInt(value1); 
              num2 = Integer.parseInt(value2); 
              int result = num1*num2; 
              JOptionPane.showMessageDialog(null,"The product is: "+result); 
              break; 

           case "/": 
           case "division": 

              num1 = Integer.parseInt(value1); 
              num2 = Integer.parseInt(value2); 
              double result = (double)num1/num2; 
              JOptionPane.showMessageDialog(null,"The quotient is: "+result); 
              break; 

           default: 
              error1 = JOptionPane.showConfirmDialog(null,"Invalid operation, please try again","Error",JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE); //I need help here for creating a loop that will take me back to the beginning. 
         } 
         //option = JOptionPane.showConfirmDialog(null, message, "SimpleCalculator", JOptionPane.OK_CANCEL_OPTION); 
       } 
       catch(NumberFormatException ne) 
       { 
         JOptionPane.showConfirmDialog(null,"Invalid! Please input an integer","Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); //When I press ok, I need help to bring me back to input entries 
       } 

      } 
      else if (option == JOptionPane.CANCEL_OPTION) 
      { 
       JOptionPane.showMessageDialog(null,"Thank you for using our program!"); 
       exit = true; 
      } 

     } 
+0

L'erreur a disparu, mais quand je ne saisissez pas toutes les opérations ou l'opération n'est pas le même dans les choix de l'erreur « Opération non valide, s'il vous plaît essayer à nouveau » ne sera pas afficher seulement le "Invalide! S'il vous plaît entrer un nombre entier" –

+0

Cela fonctionne pour moi. La clé est qu'elle valide d'abord les nombres valides et seulement si ceux-ci sont entrés et valides validera l'opération. Donc, si j'entre des nombres valides pour les premier et deuxième entiers, je vois qu'il me donne une erreur de validation correctement pour l'opération si elle n'est pas entrée ou une erreur invalide. Cela me semble correct. – pczeus

+0

J'ai remarqué cela aussi. Merci pour votre réponse cela m'aide beaucoup et j'ai compris votre solution. Mais il y a une chose que je dois poser une question sans rapport à mon problème, puis-je mettre equalsIgnoreCase() dans une déclaration de cas de commutateur? –

0

RCA: D'abord, vous vérifier si les valeurs entrées dans les fichiers texte sont des entiers dans try catch.

try 
           { 
            int num1 = Integer.parseInt(value1); 
            int num2 = Integer.parseInt(value2); 
           } 
          catch(NumberFormatException ne) 
           { 
            JOptionPane.showConfirmDialog(null,"Invalid! Please input an integer","Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); //When I press ok, I need help to bring me back to input entries 
           } 

Qu'ils soient entiers ou non alors vous essayez de converte valeur textfields aux entiers dans l'instruction switch. Ensuite, java essaie de convertir ces valeurs en Interger mais il ne peut pas en raison de l'erreur de format numérique. Alors que java disply cette erreur.

Arrière du travail: Déplacer l'instruction switch à l'intérieur pour essayer d'attraper où vérifier les valeurs des champs de texte. Créer int num1; int num2; comme méthode variable locale.

Code final:

public static void main(String [] args) 
    { 
      int error1, error2; 
      JTextField field1 = new JTextField(); 
      JTextField field2 = new JTextField(); 
      JTextField field3 = new JTextField(); 
      int num1; 
      int num2; 
      Object[] message = 
       { 
        "Enter first integer:", field1, 
        "Input second integer:", field2, 
        "Choose the operation to be used\nAddition(+)\nSubtraction(-)\nMultiplication(*)\nDivision(/):", field3, 
       }; 
     int option = JOptionPane.showConfirmDialog(null, message, "SimpleCalculator", JOptionPane.OK_CANCEL_OPTION); 

     boolean shouldexit = false; 
     while(!shouldexit) 
       { 
        if(option == JOptionPane.OK_OPTION) 
        { 
          String value1 = field1.getText(); 
          String value2 = field2.getText();   
          String operation = field3.getText(); 

          try 
           { 
             num1 = Integer.parseInt(value1); 
             num2 = Integer.parseInt(value2); 

               switch(operation = field3.getText()) 
           { 
            case "+": 
            case "Addition": 
             { 
               num1 = Integer.parseInt(value1); 
               num2 = Integer.parseInt(value2); 
               int result = num1+num2; 
               JOptionPane.showMessageDialog(null,"The sum is: "+result); 
               break; 
             } 
            case "-": 
            case "Subtraction": 
             { 
               num1 = Integer.parseInt(value1); 
               num2 = Integer.parseInt(value2); 
               int result = num1-num2; 
               JOptionPane.showMessageDialog(null,"The difference is: "+result); 
               break; 
              } 
            case "*": 
            case "Multiplication": 
              { 
               num1 = Integer.parseInt(value1); 
               num2 = Integer.parseInt(value2); 
               int result = num1*num2; 
               JOptionPane.showMessageDialog(null,"The product is: "+result); 
               break; 
              } 
            case "/": 
            case "Division": 
              { 
               num1 = Integer.parseInt(value1); 
               num2 = Integer.parseInt(value2); 
               double result = (double)num1/num2; 
               JOptionPane.showMessageDialog(null,"The quotient is: "+result); 
               break; 
              } 

            default: 
               error1 = JOptionPane.showConfirmDialog(null,"Invalid operation, please try again","Error",JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE); //I need help here for creating a loop that will take me back to the beginning. 
        } 

           } 
          catch(NumberFormatException ne) 
           { 
            JOptionPane.showConfirmDialog(null,"Invalid! Please input an integer","Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); //When I press ok, I need help to bring me back to input entries 
           } 


        option = JOptionPane.showConfirmDialog(null, message, "SimpleCalculator", JOptionPane.OK_CANCEL_OPTION); 

       } 
        else 
        { 
          JOptionPane.showMessageDialog(null,"Thank you for using our program!"); 
          shouldexit = true; 
        } 


    }} 
+0

Merci, je l'ai déjà fait et ça règle mon problème. Merci quand même. –