如何在不使用while(true)循环的情况下实现switch语句的循环逻辑
解决方案:精简数组计算器代码并优化循环与结果输出
核心优化点
- 用布尔标记变量替代
while(true),提升代码可读性 - 抽取重复逻辑为工具方法,大幅精简冗余代码
- 将结果打印逻辑移至循环外部,彻底解决代码不可达问题
- 统一处理输入校验与运算逻辑,提升代码可维护性
重构后的完整代码
import java.util.Scanner; public class ArrayCalculator { private static final Scanner input = new Scanner(System.in); public static void main(String[] args) { // 获取合法的数组长度 int arraySize = getValidPositiveInt( "请输入数组的长度:", "数组长度过小,请输入更大的数值:" ); // 初始化数组并填充元素 int[] array = new int[arraySize]; System.out.println("请输入数组的元素值:"); for (int i = 0; i < arraySize; i++) { array[i] = input.nextInt(); } input.nextLine(); // 清除输入缓冲区的换行符 String operation = null; int calcValue = 0; boolean operationCompleted = false; // 用布尔标记替代while(true),循环获取合法操作符 while (!operationCompleted) { System.out.println("请输入你要执行的操作符(+、-、*、/):"); operation = input.nextLine().trim(); switch (operation) { case "+": case "-": case "*": case "/": calcValue = getValidPositiveInt( String.format("请输入要与数组元素进行%s运算的数值:", operation), "输入的数值过小,请输入更大的正数:" ); // 执行数组运算 performArrayOperation(array, operation, calcValue); operationCompleted = true; // 标记操作完成,跳出循环 break; default: System.out.println("无效的操作符!请输入+、-、*或/。"); } } // 循环外部统一打印运算结果 printResult(array, operation); input.close(); } // 通用方法:获取正整数输入(含校验) private static int getValidPositiveInt(String prompt, String errorMsg) { System.out.println(prompt); int value = input.nextInt(); input.nextLine(); // 清除换行符 while (value <= 0) { System.out.println(errorMsg); value = input.nextInt(); input.nextLine(); } return value; } // 通用方法:执行数组运算 private static void performArrayOperation(int[] array, String operation, int value) { for (int i = 0; i < array.length; i++) { switch (operation) { case "+": array[i] += value; break; case "-": array[i] -= value; break; case "*": array[i] *= value; break; case "/": if (value == 0) { throw new IllegalArgumentException("不能除以0!"); } array[i] /= value; break; } } } // 通用方法:打印运算结果 private static void printResult(int[] array, String operation) { String operationName = switch (operation) { case "+" -> "加法"; case "-" -> "减法"; case "*" -> "乘法"; case "/" -> "除法"; default -> ""; }; System.out.printf("执行%s后的数组元素为: ", operationName); for (int i = 0; i < array.length; i++) { if (i > 0) System.out.print(", "); System.out.print(array[i]); } System.out.println("。"); } }
优化细节说明
- 替代
while(true):使用operationCompleted布尔变量控制循环结束条件,逻辑清晰直观,避免了无限循环的可读性问题 - 解决代码不可达问题:移除原代码中每个case里的
System.exit(0),改用标记变量跳出循环,确保循环后的打印代码可以正常执行 - 代码精简:将重复的输入校验、数组运算、结果打印逻辑抽成独立方法,消除大量冗余代码,同时提升了代码的可复用性
- 额外修复:增加了除法时的除零判断,避免原代码潜在的运行时错误;统一处理输入后的换行符清除,防止后续输入出现异常
内容的提问来源于stack exchange,提问作者Heaper
相关产品推荐
相关产品推荐

