使用继承和Scanner简单计算我如何处理这些异常?

时间:2017-07-27 19:50:12

标签: java oop inheritance java.util.scanner calculator

我试图使用扫描仪和继承制作一个简单的计算器,在我插入两个数字后,我发现了这个例外

异常是:

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)

我的Java代码:第一类是超类它名称是 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;
    }

}

子类 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-class 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);
            }
        }
    }
}

我希望我能用大部分细节解释这个错误,谢谢。

3 个答案:

答案 0 :(得分:0)

From the Java doc itself

  

public short nextShort() 将输入的下一个标记缩短为空。

     

抛出:

     

InputMismatchException - 如果下一个标记与整数不匹配   正则表达式,或超出范围

因为+/-*Integer

不匹配

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

而且,要正确使用返回线,最好:

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

另外你的测试如果不好,因为如果你输入一个&#39; - &#39;,它将会是&#39; +&#39;如此真实,你会进入if,事实上,如果它与ALL 4 possib不同,那么你需要og inot,修复:

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

要问用户,直到他给出一个好的操作员,你可以这样做:(但它也会再次询问2个整数,因为它的方法相同)/避免相同的代码更好地放{{1最后,并使用一个开关,它的性能更高:

print

答案 1 :(得分:0)

有你的问题:

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

{+ 1}} <+ 1>无法读取+也 - 也不会* /。

您可以使用

  

public String next(模式模式)

     

如果匹配指定的模式,则返回下一个标记。这个   方法可能会在等待输入扫描时阻塞,即使是先前的   hasNext(Pattern)的调用返回true。如果匹配   成功后,扫描仪会超过与之匹配的输入   图案。

link

答案 2 :(得分:0)

首先,扫描仪设计用于检索由空格字符分隔的值行。因此,如果您想阅读一个字符,请使用

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

上面的这一行会获取你输入的字符,这样你就不用担心IndexOutofBoundException,因为你没有从索引中获取而没有NullPointerException,因为你正在使用变量而不是对象。
所以现在查看你的代码很明显你正在编写一个接受字符并执行操作的方法,所以在这种情况下你只需创建一个switch case并按case检查所有可能的操作并从默认情况下抛出错误消息< / p>

将您的代码重构为

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(); 
       }
   }