Java简易计算器首次尝试出现问题,请求技术排查
解决Java简易计算器的常见问题与代码优化建议
从你贴出的不完整代码来看,你在编写简易计算器时大概率遇到了异常处理或循环逻辑的问题吧?我结合你现有代码的思路,帮你梳理下常见的坑和修复方案:
你提供的现有代码片段
package com.indie; import java.util.InputMismatchException; import java.util.Scanner; import static com.indie.Operations.*; public class Main { private static double Number1; private static double Number2; private static double Total; private static String Symbol; private static boolean noError; private static boolean exceptioncaught; public static void main(String[] args) throws InterruptedException{ noError = false; while (!noError) { exceptioncaught = false; while (!exc... } }
核心问题分析与修复方案
1. 完善异常捕获逻辑
你的代码写到while (!exc...就中断了,推测是想处理用户输入非数字的情况。这里需要完整实现try-catch块,并且重置Scanner缓冲区,不然捕获异常后会直接进入死循环。示例代码如下:
Scanner scanner = new Scanner(System.in); while (!noError) { exceptioncaught = false; try { System.out.print("请输入第一个数字: "); Number1 = scanner.nextDouble(); System.out.print("请输入操作符(+/-/*/): "); Symbol = scanner.next(); System.out.print("请输入第二个数字: "); Number2 = scanner.nextDouble(); exceptioncaught = false; noError = true; // 输入合法,退出循环 } catch (InputMismatchException e) { System.out.println("输入错误!请输入有效的数字"); scanner.nextLine(); // 清除缓冲区的无效输入 exceptioncaught = true; } }
2. 优化变量作用域
你把所有变量都声明为静态类变量,其实这些变量只在main方法的循环内使用,改为局部变量更符合面向对象的设计原则,还能避免不必要的全局状态污染:
public static void main(String[] args) throws InterruptedException{ Scanner scanner = new Scanner(System.in); boolean noError = false; while (!noError) { boolean exceptioncaught = false; double number1 = 0; double number2 = 0; String symbol = ""; // 后续逻辑... } }
3. 操作符合法性校验
别忽略操作符的校验!用户可能输入#、@这类非法符号,直接计算会出错,得加一层判断:
// 输入操作符后添加判断 if (!symbol.equals("+") && !symbol.equals("-") && !symbol.equals("*") && !symbol.equals("/")) { System.out.println("无效的操作符!请输入+/-/*/"); exceptioncaught = true; noError = false; continue; // 重新循环输入 }
4. 除法的除数为0处理
做除法时必须判断除数是否为0,不然会抛出ArithmeticException,直接让程序崩溃:
double total = 0; switch (symbol) { case "+": total = number1 + number2; break; case "-": total = number1 - number2; break; case "*": total = number1 * number2; break; case "/": if (number2 == 0) { System.out.println("错误:除数不能为0"); exceptioncaught = true; noError = false; continue; } total = number1 / number2; break; }
完整的可运行示例代码
package com.indie; import java.util.InputMismatchException; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); boolean noError = false; while (!noError) { boolean exceptioncaught = false; double number1 = 0; double number2 = 0; String symbol = ""; try { // 输入第一个数字 System.out.print("请输入第一个数字: "); number1 = scanner.nextDouble(); // 输入操作符并校验 System.out.print("请输入操作符(+/-/*/): "); symbol = scanner.next(); if (!symbol.equals("+") && !symbol.equals("-") && !symbol.equals("*") && !symbol.equals("/")) { System.out.println("无效的操作符!请输入+/-/*/"); exceptioncaught = true; scanner.nextLine(); // 清除缓冲区 continue; } // 输入第二个数字 System.out.print("请输入第二个数字: "); number2 = scanner.nextDouble(); // 执行计算 double total = 0; switch (symbol) { case "+": total = number1 + number2; break; case "-": total = number1 - number2; break; case "*": total = number1 * number2; break; case "/": if (number2 == 0) { System.out.println("错误:除数不能为0"); exceptioncaught = true; continue; } total = number1 / number2; break; } // 输出结果 System.out.printf("计算结果:%.2f %s %.2f = %.2f%n", number1, symbol, number2, total); noError = true; // 计算完成,退出循环 } catch (InputMismatchException e) { System.out.println("输入错误!请输入有效的数字"); scanner.nextLine(); // 清除无效输入 exceptioncaught = true; } } scanner.close(); } }
你可以把这段代码替换你的现有代码,测试下输入各种合法/非法内容的情况,应该就能解决你遇到的问题了。
内容的提问来源于stack exchange,提问作者Gmpro111
相关产品推荐
相关产品推荐

