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



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

例外情况是:

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

最新更新