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

Posted

技术标签:

【中文标题】使用继承和扫描仪简单计算我如何处理这些异常?【英文标题】:Simple calculate using inheritance and Scanner how i handle these Exceptions? 【发布时间】:2017-07-27 19:50:11 【问题描述】:

我也在尝试使用扫描仪和继承来制作一个简单的计算器,在我插入两个数字和运算符后,我发现了这个异常

例外情况是:

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 代码:第一类是 Superclass 它的名字是 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;
    

主类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);
            
        
    

我希望我用大部分细节很好地解释了这个错误,谢谢。

【问题讨论】:

【参考方案1】:

From the Java doc itself:

public short nextShort() 将输入的下一个标记扫描为short。

投掷:

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

因为+/-*Integer 不匹配

你可以使用op = sca.nextLine().charAt(0);


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

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

如果你的测试不好,也是你的测试,因为如果你输入一个'-',它会与'+'不同,所以你会进入if,事实上,如果它不同,你需要og inot全部 4 种可能性,修复:

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

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

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^^)


        

【讨论】:

【参考方案2】:

这是你的问题:

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

nextShort 不能读取 + 或 - 或 * 或 /。

你可以使用

公共字符串下一个(模式模式)

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

link

【讨论】:

这个方法只返回下一个字符串标记。那么我如何将它与 char 一起使用?【参考方案3】:

首先,扫描器旨在检索由空格字符分隔的值行。因此,如果您想读取一个字符,请使用

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

上面这行将获取您输入的字符,这样您就不必担心 IndexOutofBoundException,因为您没有从索引获取,也没有 NullPointerException,因为您使用的是变量而不是对象。 因此,现在查看您的代码,很明显您正在编写一个接受字符并执行操作的方法,因此在这种情况下,您只需创建一个 switch case 并按大小写检查所有可能的操作并从默认 case

所以重构你的代码为

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

【讨论】:

是的,我知道 switch 它更简单,更适合这个例子,非常感谢:) :) @harish 所以你能告诉我如果我插入一个错误的操作我该怎么办#,默认语句会告诉我你必须输入一个有效的运算符,但我需要告诉我并插入一个新的运算符然后再次检查,我使用了继续;但它不起作用,我想了很多,但我无法达到那个机制:(@harish-barma 为此,您必须将方法切换案例包装在一个方法中并从默认值调用该方法 如果用户给出了错误的操作符,我已经更新了递归调用 switch 块的答案。 真的好主意,我认为这是最好的,但我有不同的方法,使用 for 并初始化一个变量,然后在默认情况下分配两次,在其余情况下分配一次,每次都找到默认值值递归开关盒。非常感谢:)

以上是关于使用继承和扫描仪简单计算我如何处理这些异常?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Haskell,我如何处理大量的 XML?

我如何处理 PayPal 公钥?

我如何处理 .FirstOrDefault 方法?

发现PDF Transformer+转换的图像字体小了如何处理

我如何处理 java 命令行参数? [复制]

我如何处理 Windows 7 的 125% 或 150% 放大倍率 (Delphi)