You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用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("。");
    }
}

优化细节说明

  1. 替代while(true):使用operationCompleted布尔变量控制循环结束条件,逻辑清晰直观,避免了无限循环的可读性问题
  2. 解决代码不可达问题:移除原代码中每个case里的System.exit(0),改用标记变量跳出循环,确保循环后的打印代码可以正常执行
  3. 代码精简:将重复的输入校验、数组运算、结果打印逻辑抽成独立方法,消除大量冗余代码,同时提升了代码的可复用性
  4. 额外修复:增加了除法时的除零判断,避免原代码潜在的运行时错误;统一处理输入后的换行符清除,防止后续输入出现异常

内容的提问来源于stack exchange,提问作者Heaper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:22:45