我也在尝试使用扫描仪和继承制作一个简单的计算器,在我插入两个数字和运算符后,我发现了这个异常
例外情况是:
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代码:第一个类是超类,它的名字是简单的计算.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;
}
}
主类:计算器.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);
}
}
}
}
我希望我用大部分细节很好地解释了这个错误,谢谢。
来自 Java 文档本身:
public short nextShort(( :将输入的下一个标记扫描为短
。抛出:
输入不匹配异常- 如果下一个标记与整数正则表达式不匹配,或者超出范围
因为+/-*
作为Integer
不匹配
Ypu maye 使用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^^)
有你的问题:
System.out.println("choose an operator + or - or * or / ");
op = (char) sca.nextShort();
+ 和 - 或 * 和/都不能用nextShort
阅读。
您可以使用
公共字符串下一篇(模式模式(
如果下一个标记与指定的模式匹配,则返回下一个标记。这 方法可能会在等待输入扫描时阻止,即使以前的 调用 hasNext(Pattern( 返回 true。如果匹配项是 成功,扫描程序前进到与 模式。
链接
首先,扫描程序设计用于检索由空格字符分隔的值行。因此,如果您想阅读一个字符,请使用
op = (char)System.in.read()
上面的这一行将获取您输入的字符,这样您就不必为IndexOutofBoundException而烦恼,因为您没有执行从索引获取,也没有NullPointerException,因为您使用的是变量而不是对象。
所以现在看看你的代码,很明显你正在编写一个接受字符并执行操作的方法,所以在这种情况下,你可以简单地创建一个开关大小写,并按大小写检查所有可能的操作,并从默认大小写中抛出错误消息
所以重构你的代码
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();
}
}