用控制台实现个简单的计算器功能,想捕获处理用户输入格式异常时发现捕获一次后,只会无限循环打印该异常信息,因为每次循环执行的数据都是第一次输入的数据,所以一直报异常。
解决办法简而言之,就是把流放进循环里,每次都重新创建(有点浪费…)
原来写法
写的逻辑可能比较复杂了,因为练习时想多涉及些知识点…
public static void main(String[] args){
ICalculatorImpl test=new ICalculatorImpl();
Operate op=new Operate();
Scanner sc=new Scanner(System.in);
//循环输入
while(true) {
System.out.println("请输入两个数字和一个运算符(示例:2333 + 666)");
try {
//根据用户输入设置N1值
op.setN1(sc.nextDouble());
//输入运算符
String operator=sc.next();
//根据用户输入设置N2值
op.setN2(sc.nextDouble());
//判断用户输入是否规范
if(op.getN2()==0) {
System.out.println("除数不可为0!!!");
}
else {
//调用计算方法
test.calcu(op.getN1(), op.getN2(), operator);
System.out.println("============================");
}
}catch(InputMismatchException e) {
System.out.println("Error:输入格式错误,请参考示例!");
System.out.println("============================");
}
}
}
把sc写在循环外是想节约资源的,但是输入格式错误后会一直无限循环报异常
解决方法
把sc写在循环里面就行了
public static void main(String[] args){
ICalculatorImpl test=new ICalculatorImpl();
//循环输入
while(true) {
Operate op=new Operate();
Scanner sc=new Scanner(System.in);
System.out.println("请输入两个数字和一个运算符(示例:2333 + 666)");
try {
//根据用户输入设置N1值
op.setN1(sc.nextDouble());
//输入运算符
String operator=sc.next();
//根据用户输入设置N2值
op.setN2(sc.nextDouble());
//判断用户输入是否规范
if(op.getN2()==0) {
System.out.println("除数不可为0!!!");
}
else {
//调用计算方法
test.calcu(op.getN1(), op.getN2(), operator);
System.out.println("============================");
}
}catch(InputMismatchException e) {
System.out.println("Error:输入格式错误,请参考示例!");
System.out.println("============================");
}
}
}