Java计算器switch语句运算符多字符输入校验异常修复求助
Java计算器运算符输入校验问题修复方案
问题根因
现有代码的核心问题出在运算符读取逻辑:userOperation = operation.next().charAt(0) 仅提取输入字符串的第一个字符,完全没有校验输入的总长度,所以只要首字符匹配合法运算符,不管后续有没有多余字符都会正常执行,不会触发报错。另外同时创建两个Scanner实例读取同一个System.in输入流,也容易引发后续输入读取异常。
可行修复步骤
- 第一步:合并两个
Scanner实例为同一个,避免输入流冲突 - 第二步:读取运算符时先获取完整的输入字符串,先判断字符串长度是否为1,长度不符合直接抛出非法输入提示
- 第三步:长度校验通过后,再提取唯一的字符判断是否属于合法运算符,再走对应的运算逻辑
修复后完整代码
import java.util.Scanner; public class javacalculator { public static void main(String[] args) { // 合并为单个Scanner实例 Scanner scanner = new Scanner(System.in); double num1, num2, answer; System.out.print("Enter your full name: "); String userName = scanner.nextLine(); System.out.println("+ Addition"); System.out.println("- Subtraction"); System.out.println("* Multiplication"); System.out.println("/ Division"); System.out.println("% Modulus"); System.out.println("\n"); System.out.print("Enter mathematical operator e.g. + for Addition: "); // 先读取完整的运算符输入字符串并去除首尾空格 String opInput = scanner.next().trim(); // 先校验长度是否为1 if (opInput.length() != 1) { System.out.println("Invalid operator! Please enter a single valid operator."); scanner.close(); return; } // 长度合法再提取字符 char userOperation = opInput.charAt(0); switch (userOperation) { case '+': System.out.print("Enter first number: "); num1 = scanner.nextDouble(); System.out.print("Enter the second number: "); num2 = scanner.nextDouble(); answer = num1 + num2; System.out.print(num1 + " + " + num2 + " = " + answer); break; case '-': System.out.print("Enter first number: "); num1 = scanner.nextDouble(); System.out.print("Enter the second number: "); num2 = scanner.nextDouble(); answer = num1 - num2; System.out.print(num1 + " - " + num2 + " = " + answer); break; case '*': System.out.print("Enter first number: "); num1 = scanner.nextDouble(); System.out.print("Enter the second number: "); num2 = scanner.nextDouble(); answer = num1 * num2; System.out.print(num1 + " * " + num2 + " = " + answer); break; case '/': System.out.print("Enter first number: "); num1 = scanner.nextDouble(); System.out.print("Enter the second number: "); num2 = scanner.nextDouble(); // 额外新增除数为0的校验,避免算术异常 if (num2 == 0) { System.out.println("Error: Divisor cannot be zero."); scanner.close(); return; } answer = num1 / num2; System.out.print(num1 + " / " + num2 + " = " + answer); break; case '%': System.out.print("Enter first number: "); num1 = scanner.nextDouble(); System.out.print("Enter the second number: "); num2 = scanner.nextDouble(); answer = num1 % num2; System.out.print(num1 + " % " + num2 + " = " + answer); break; default: System.out.println("Invalid operator!"); break; } scanner.close(); } }
额外优化说明
- 原代码读取数字用
nextInt()仅支持整数输入,改为nextDouble()后支持小数运算 - 新增输入字符串去空格逻辑,避免用户输入前后带空格导致校验失败
- 用完
Scanner后主动关闭释放输入流资源
内容的提问来源于stack exchange,提问作者ripsly25
相关产品推荐
相关产品推荐

