Java计算器添加while循环实现持续使用的技术求助
解决计算器持续使用的循环问题
核心问题分析
- 主菜单无循环逻辑,仅执行一次即退出
- 多Scanner实例导致输入处理冲突
nextInt()/nextDouble()后未清理残留换行符,引发后续nextLine()读取空值
修正方案
- 使用单个Scanner实例处理所有输入,避免资源冲突
- 在主方法中添加
while(true)循环,直到用户输入QUIT才终止程序 - 每次调用
nextInt()/nextDouble()后,调用scanner.nextLine()消耗残留换行符 - 将
standard()和scientific()改为void方法,移除无实际用途的返回值 - 增加无效输入判断与异常处理,提升程序健壮性
修正后的完整代码
import java.util.Scanner; import java.lang.Math; import java.lang.ArithmeticException; public class Calculator { static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { System.out.println("Welcome to my calculator:"); String choice = ""; while (true) { System.out.println("\nType 1 for Standard calculator, 2 for Scientific calculator, or QUIT to exit:"); choice = scanner.nextLine().trim(); if (choice.equalsIgnoreCase("QUIT")) { System.out.println("System quit"); break; } else if (choice.equals("1")) { standard(); } else if (choice.equals("2")) { scientific(); } else { System.out.println("Invalid input, please try again."); } } scanner.close(); } public static void standard() { System.out.println("\nStandard Calculator chosen."); System.out.println("Type 1 for addition, 2 for subtraction, 3 for multiplication, 4 for exponent, 5 for division, 6 for mod:"); // 校验输入是否为有效数字 while (!scanner.hasNextInt()) { System.out.println("Please enter a valid number (1-6):"); scanner.nextLine(); } int input2 = scanner.nextInt(); scanner.nextLine(); // 清理换行符 int num1 = 0; int num2 = 0; switch (input2) { case 1: System.out.println("(Add chosen) Enter first value:"); num1 = scanner.nextInt(); System.out.println("Enter second value:"); num2 = scanner.nextInt(); scanner.nextLine(); System.out.printf("Addition - (%d + %d) = %d%n", num1, num2, Math.addExact(num1, num2)); break; case 2: System.out.println("(Sub chosen) Enter first value:"); num1 = scanner.nextInt(); System.out.println("Enter second value:"); num2 = scanner.nextInt(); scanner.nextLine(); System.out.printf("Subtraction - (%d - %d) = %d%n", num1, num2, Math.subtractExact(num1, num2)); break; case 3: System.out.println("(Multi chosen) Enter first value:"); num1 = scanner.nextInt(); System.out.println("Enter second value:"); num2 = scanner.nextInt(); scanner.nextLine(); System.out.printf("Multiplication - (%d * %d) = %d%n", num1, num2, Math.multiplyExact(num1, num2)); break; case 4: System.out.println("(Exp chosen) Enter base value:"); num1 = scanner.nextInt(); System.out.println("Enter exponent:"); num2 = scanner.nextInt(); scanner.nextLine(); System.out.printf("Exponent - (%d^%d) = %.2f%n", num1, num2, Math.pow(num1, num2)); break; case 5: System.out.println("(Div chosen) Enter dividend:"); num1 = scanner.nextInt(); System.out.println("Enter divisor:"); num2 = scanner.nextInt(); scanner.nextLine(); try { System.out.printf("Division - (%d / %d) = %d%n", num1, num2, Math.floorDiv(num1, num2)); } catch (ArithmeticException e) { System.out.println("Error: Division by zero is not allowed."); } break; case 6: System.out.println("(Mod chosen) Enter dividend:"); num1 = scanner.nextInt(); System.out.println("Enter divisor:"); num2 = scanner.nextInt(); scanner.nextLine(); try { System.out.printf("Mod - (%d %% %d) = %d%n", num1, num2, Math.floorMod(num1, num2)); } catch (ArithmeticException e) { System.out.println("Error: Division by zero is not allowed."); } break; default: System.out.println("Invalid operation choice, please try again."); } } public static void scientific() { System.out.println("\nScientific Calculator chosen."); System.out.println("Type 1 for sin, 2 for cos, 3 for tan, 4 for floor, 5 for ceil, 6 for square root, 7 for cube root, 8 for rounding, 9 for min, 10 for max:"); while (!scanner.hasNextInt()) { System.out.println("Please enter a valid number (1-10):"); scanner.nextLine(); } int input2 = scanner.nextInt(); scanner.nextLine(); // 清理换行符 double val1 = 0.0; double val2 = 0.0; switch (input2) { case 1: System.out.println("(Sin chosen) Enter value (in radians):"); val1 = scanner.nextDouble(); scanner.nextLine(); System.out.printf("Sin - (%.2f) = %.4f%n", val1, Math.sin(val1)); break; case 2: System.out.println("(Cos chosen) Enter value (in radians):"); val1 = scanner.nextDouble(); scanner.nextLine(); System.out.printf("Cos - (%.2f) = %.4f%n", val1, Math.cos(val1)); break; case 3: System.out.println("(Tan chosen) Enter value (in radians):"); val1 = scanner.nextDouble(); scanner.nextLine(); System.out.printf("Tan - (%.2f) = %.4f%n", val1, Math.tan(val1)); break; case 4: System.out.println("(Floor chosen) Enter value:"); val1 = scanner.nextDouble(); scanner.nextLine(); System.out.printf("Floor - (%.2f) = %.0f%n", val1, Math.floor(val1)); break; case 5: System.out.println("(Ceil chosen) Enter value:"); val1 = scanner.nextDouble(); scanner.nextLine(); System.out.printf("Ceil - (%.2f) = %.0f%n", val1, Math.ceil(val1)); break; case 6: System.out.println("(Square root chosen) Enter non-negative value:"); val1 = scanner.nextDouble(); scanner.nextLine(); if (val1 >= 0) { System.out.printf("Square root - (%.2f) = %.4f%n", val1, Math.sqrt(val1)); } else { System.out.println("Error: Square root of negative number is not real."); } break; case 7: System.out.println("(Cube root chosen) Enter value:"); val1 = scanner.nextDouble(); scanner.nextLine(); System.out.printf("Cube root - (%.2f) = %.4f%n", val1, Math.cbrt(val1)); break; case 8: System.out.println("(Round chosen) Enter value:"); val1 = scanner.nextDouble(); scanner.nextLine(); System.out.printf("Round - (%.2f) = %.0f%n", val1, Math.round(val1)); break; case 9: System.out.println("(Min chosen) Enter first value:"); val1 = scanner.nextDouble(); System.out.println("Enter second value:"); val2 = scanner.nextDouble(); scanner.nextLine(); System.out.printf("Minimum - (%.2f, %.2f) = %.2f%n", val1, val2, Math.min(val1, val2)); break; case 10: System.out.println("(Max chosen) Enter first value:"); val1 = scanner.nextDouble(); System.out.println("Enter second value:"); val2 = scanner.nextDouble(); scanner.nextLine(); System.out.printf("Maximum - (%.2f, %.2f) = %.2f%n", val1, val2, Math.max(val1, val2)); break; default: System.out.println("Invalid operation choice, please try again."); } } }
关键改进说明
- 循环控制:主菜单被
while(true)包裹,用户输入QUIT时通过break退出循环,实现持续使用 - 输入稳定性:统一Scanner实例并清理换行符,解决了输入读取异常问题
- 健壮性提升:新增无效输入校验、除零异常捕获、负数开平方判断等,避免程序崩溃
- 代码简洁性:移除无意义返回值,优化输出格式,提升可读性
内容的提问来源于stack exchange,提问作者Alfy James
相关产品推荐
相关产品推荐

