2017-07-27 1 views
0

Je suis en train de faire une simple calculatrice en utilisant le scanner et l'héritage aussi, après avoir insérer deux numéros et l'opérateur i trouvé cette exceptionSimple calculer en utilisant l'héritage et Scanner comment je gère ces exceptions?

l'exception est:

Exception in thread "main" java.util.InputMismatchException 
at java.util.Scanner.throwFor(Scanner.java:864) 
at java.util.Scanner.next(Scanner.java:1485) 
at java.util.Scanner.nextShort(Scanner.java:1987) 
at java.util.Scanner.nextShort(Scanner.java:1946) 
at calculator.simplecalc.<init>(simplecalc.java:18) 
at calculator.simplecalc_inhe.<init>(simplecalc_inhe.java:7) 
at calculator.Calculator.main(Calculator.java:6) 

Mon code Java: premier classe est superclasse nom de c'est simplecalc.java

package calculator; 
import java.util.Scanner; 

public class simplecalc { 

    private int val1; 
    private int val2; 
    private Scanner sca; 
    public char op; 
    public int result; 

    public simplecalc() 
    { 
     sca = new Scanner(System.in); 
     System.out.println("Enter the first number"); 
     val1 = sca.nextInt(); 
     System.out.println("Enter the Second number"); 
     val2 = sca.nextInt(); 
     System.out.println("choose an operator + or - or * or/"); 
     op = (char) sca.nextShort(); 
     System.out.println(op); 
    } 

    /*use if operator not equal + or - */ 
    public char set_op() 
    { 
     op = (char) sca.nextShort(); 
     return op; 
    } 


    public int calsum() 
    { 
     return this.val1 + this.val2; 
    } 

    public int calsub() 
    { 
     return this.val1 - this.val2; 
    } 

    //i don't use setX and setX i write them because i use getX,Y 

    /* public void setX(int x) 
    { 
     this.val1 = x; 
    } 
    public void setY(int y) 
    { 
     this.val2 = y; 
    } */ 

    public int getX() 
    { 
     return this.val1; 
    } 
    public int getY() 
    { 
     return this.val2; 
    } 

} 

Sous: simplecalc_inhe.java

package calculator; 

public class simplecalc_inhe extends simplecalc { 

    public simplecalc_inhe() 
    { 
     super(); 
    } 


    public int mult() 
    { 
     return this.getX() * this.getY(); 
    } 

    public int div() 
    { 
     int z = this.getY(); 
     if(z == 0){ 
      return 0; 
     } 
     return this.getX()/z; 
    } 
} 

Main-classe: Calculator.java

package calculator; 

public class Calculator { 

    public static void main(String[] args) { 
     simplecalc_inhe cal = new simplecalc_inhe(); 

     if (cal.op != '+' || cal.op != '-' || cal.op != '*' || cal.op != '/') 
     { 
      System.out.println("You must enter a vaild operator"); 
      cal.set_op(); //to set operator 

     } else { 

      if(cal.op == '+') { 
       cal.result = cal.calsum(); 
       System.out.println(cal.result); 

      }else if(cal.op == '-') { 
       cal.result = cal.calsub(); 
       System.out.println(cal.result); 

      }else if(cal.op == '*') { 
       cal.result = cal.mult(); 
       System.out.println(cal.result); 

      }else if(cal.op == '/') { 
       cal.result = cal.div(); 
       System.out.println(cal.result); 
      } 
     } 
    } 
} 

J'espère que j'ai expliqué que l'erreur bien avec la plupart des détails, je vous remercie.

Répondre

0

From the Java doc itself:

courte nextShort publique(): scanne le jeton suivant de l'entrée comme un court.

Lancers:

InputMismatchException - si le prochain jeton ne correspond pas au nombre entier expression régulière, ou est hors de portée

Parce que +/-* ne correspond pas comme Integer

Ypu maye utiliser op = sca.nextLine().charAt(0);


Et aussi, d'utiliser la ligne de retour correctement, mieux faire:

val1 = Integer.parseInt(sca.nextLine()); 
val2 = Integer.parseInt(sca.nextLine()); 
op = sca.nextLine().charAt(0); 

également votre test sinon bon, parce que si vous entrez un « - », il sera différent de « + » si vrai et vous og dans le if, en fait, vous devez og si mal placé est différent des 4 possib, fixer par:

if (cal.op != '+' && cal.op != '-' && cal.op != '*' && cal.op != '/') 

Pour demander à l'utilisateur jusqu'à ce qu'il donne un bon opérateur vous pouvez faire comme ceci: (mais il faudra aussi demander les 2 ints car c'est la même méthode)/pour éviter le même code mieux mettre le print à la fin, et utiliser un switch, il est plus performant:

do{ 
    System.out.println("You must enter a vaild operator"); 
    cal.set_op(); //to set operator 
} while(cal.op != '+' && cal.op != '-' && cal.op != '*' && cal.op != '/'); 

switch(cal.op){ 
     case '+': 
      cal.result = cal.calsum(); 
      break; 
     case '-': 
      cal.result = cal.calsub(); 
      break; 
     case '*': 
      cal.result = cal.mult(); 
      break; 
     case '/': 
      cal.result = cal.div(); 
      break; 
     default : break;  //safety check 
} 
System.out.println(cal.result); //try to not have SAME code written twice (or more^^) 
0

il y a votre problème:

System.out.println("choose an operator + or - or * or/"); 
    op = (char) sca.nextShort(); 

ni + ni - ni * ni/peut être lu avec nextShort.

Vous pouvez utiliser

chaîne suivante (motif de modèle) publique

Renvoie le jeton suivant si elle correspond au modèle spécifié. Cette méthode peut bloquer en attendant que l'entrée soit analysée, même si l'appel précédent de hasNext (Motif) a renvoyé la valeur true. Si la correspondance est réussie, le scanner avance au-delà de l'entrée correspondant au modèle .

link

+0

Cette méthode renvoie simplement le jeton suivant String. alors comment je l'utilise avec char? – Mohamed

0

Tout d'abord le scanner conçu pour extraire la ligne de valeurs séparées par des espaces blancs. Donc, si vous voulez lire un personnage puis utilisez

op = (char)System.in.read() 

cette ligne ci-dessus vous chercher le personnage que vous avez entré pour que vous ne devez pas se soucier de IndexOutofBoundException parce que vous ne faites pas d'un get index et pas NullPointerException parce que vous êtes jouer avec des variables que des objets.Maintenant, en regardant votre code, il est clair que vous écrivez une méthode qui accepte le caractère et fait l'opération, dans ce cas vous pouvez simplement créer un cas de commutateur et vérifier toutes les opérations possibles par cas et lancer un message d'erreur par défaut cas

donc refactorisation votre code comme

public void doOperation() { 
switch(cal.op) 
{ 
    case '+' : 
     cal.result = cal.calsum(); 
     System.out.println(cal.result); 
     break; 

    case '-' : 
     cal.result = cal.calsub(); 
     System.out.println(cal.result); 
     break; 

    case '*' : 
      cal.result = cal.mult(); 
      System.out.println(cal.result); 
      break; 
    case '/' : 
     cal.result = cal.div(); 
     System.out.println(cal.result); 
     break; 
    default : System.out.println("You must enter a vaild operator"); 
      cal.set_op(); 
      doOperation(); 
     } 
    } 
+0

ouais je sais passer c'est plus simple et plus facile pour cet exemple merci beaucoup :) :) @harish – Mohamed

+0

alors pourriez-vous me dire ce que je peux faire si j'insère un mauvais op comme #, la déclaration par défaut me le dira entrer un opérateur de vaild mais je dois me le dire et insérer un nouvel opérateur puis le vérifier à nouveau j'ai utilisé continuer; mais cela ne fonctionne pas, je pense beaucoup mais je ne peux pas atteindre ce mécanisme :(@ harish-barma – Mohamed

+0

pour que vous devez envelopper le cas de commutateur de méthode dans une méthode et appelez cette méthode par défaut –