Java计算器代码编译失败及输入处理异常问题求助
解决你的Java计算器输入异常问题
嘿,我看到你遇到的问题了,咱们一步步拆解并解决它:
问题1:字符串比较逻辑错误
你现在判断用户输入的回答时用了==,但在Java里,==是用来比较对象的引用地址,而不是字符串的实际内容。哪怕用户输入了"yes",Answer == "yes"也会返回false——因为这两个是内存中不同的字符串对象,自然匹配不上。
解决办法是改用equals()(严格区分大小写)或者equalsIgnoreCase()(忽略大小写,对用户更友好):
if (Answer.equalsIgnoreCase("yes")) { Calculator(); } else if (Answer.equalsIgnoreCase("no")) { System.out.println("Thank you for using our Calculator app"); } else { System.out.println("Please, enter a valid answer"); }
问题2:Scanner输入缓冲区的换行符残留
这是更隐蔽的核心问题:你之前用reader.nextDouble()和reader.next()读取数字、操作符时,这些方法只会读取有效输入,不会处理用户输入结束后按下的回车键(也就是换行符)。当你创建reader2并调用reader2.nextLine()时,它会直接读取到缓冲区里残留的空换行符,导致Answer变成空字符串——这就会直接触发无效提示,不管你之后输入什么内容。
解决办法:
- 不要创建多个Scanner对象,重复使用同一个即可(避免资源浪费)
- 在读取用户的回答前,先调用
reader.nextLine()清空缓冲区里的残留换行符
修改后的这部分代码:
// 复用之前的reader,不用新建reader2 System.out.println("Anything else to calculate?"); // 先清空缓冲区残留的换行符 reader.nextLine(); String Answer = reader.nextLine();
额外优化:方法返回值规范
你的Calculator()方法声明了返回double,但方法内没有统一的return语句(之前编译报错就是因为这个)。其实这个方法是执行计算逻辑,不需要返回结果,把它改成void类型更合理:
public static void Calculator(){ // 内部逻辑不变,无需再添加return语句 }
完整修改后的代码
package calc; import java.util.Scanner; public class Calc { public static void main(String[] args){ Calculator(); } static double sum (double val1, double val2){ return val1 + val2; } static double substract (double val1, double val2) { return val1 - val2; } static double multiply (double val1, double val2) { return val1 * val2; } static double divide (double val1, double val2) { return val1 / val2; } public static void Calculator(){ Scanner reader = new Scanner(System.in); System.out.println("Enter the first number, please"); double x = reader.nextDouble(); System.out.println("Enter the second number, please"); double y = reader.nextDouble(); System.out.println("Enter desired operation, please"); char z = reader.next().charAt(0); switch(z) { case '+': double a = sum(x,y); System.out.println(a); break; case '-': double b = substract(x,y); System.out.println(b); break; case '*': double c = multiply(x,y); System.out.println(c); break; case '/': double d = divide (x,y); System.out.println(d); break; default: System.out.println("Invalid operation!"); } System.out.println("Anything else to calculate?"); // 清空缓冲区残留的换行符 reader.nextLine(); String Answer = reader.nextLine(); if (Answer.equalsIgnoreCase("yes")) { Calculator(); } else if (Answer.equalsIgnoreCase("no")) { System.out.println("Thank you for using our Calculator app"); reader.close(); // 关闭Scanner避免资源泄漏 } else { System.out.println("Please, enter a valid answer"); Calculator(); // 递归让用户重新输入 } } }
这样修改后,你的计算器就能正常处理用户的输入回答,不会再出现不管输入什么都提示无效的问题啦!
内容的提问来源于stack exchange,提问作者Alex List
相关产品推荐
相关产品推荐

