使用继承和扫描仪简单计算我如何处理这些异常?
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 并初始化一个变量,然后在默认情况下分配两次,在其余情况下分配一次,每次都找到默认值值递归开关盒。非常感谢:)以上是关于使用继承和扫描仪简单计算我如何处理这些异常?的主要内容,如果未能解决你的问题,请参考以下文章