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

为Java显示菜单添加循环:选中退出选项后方终止循环

问题分析与修正方案

我仔细看了你的代码,确实存在几个关键问题导致循环逻辑无法正常工作,下面逐个说明并给出修正后的实现:

原代码的核心问题

  • 循环条件完全错误:while(s < size())里的s是字符串类型,根本不能和未定义的size()方法做数值比较,而且你的需求是直到用户选择X才退出,这个逻辑完全不匹配。
  • 未正确读取用户输入:console.nextLine();只是读取了输入但没有赋值给s,导致s一直是空字符串,执行s.charAt(0)时会直接抛出StringIndexOutOfBoundsException异常。
  • 无效的字符串自增:s++;是语法错误,String类型不支持自增操作,这行代码既无意义也无法编译。
  • 输入大小写未兼容:如果用户输入小写的x、a等,你的switch分支不会识别,会进入default错误分支。

修正后的完整代码

import java.util.Scanner;

public class LoopTest {
    // 把菜单选项定义为常量,方便后续维护
    private static final String OPTION_A = "A";
    private static final String OPTION_B = "B";
    private static final String OPTION_C = "C";
    private static final String OPTION_D = "D";
    private static final String OPTION_EXIT = "X";

    public void displayMenu() {
        System.out.println("A. Option #A");
        System.out.println("B. Option #B");
        System.out.println("C. Option #C");
        System.out.println("D. Option #D");
        System.out.println("X. Exit");
        System.out.print("Please enter your choice: ");
    }

    public void start() {
        // 使用try-with-resources自动关闭Scanner,避免资源泄漏
        try (Scanner console = new Scanner(System.in)) {
            String choice;
            // 无限循环,直到用户选择退出选项
            while (true) {
                displayMenu();
                // 读取用户输入并转为大写,兼容大小写输入
                choice = console.nextLine().trim().toUpperCase();

                // 先判断输入是否为空,避免空指针
                if (choice.isEmpty()) {
                    System.out.println("Error: Please enter a non-empty choice!\n");
                    continue;
                }

                // 取第一个字符进行判断
                char selected = choice.charAt(0);
                switch (selected) {
                    case 'A':
                        System.out.println("You selected Option A - [这里可以添加具体操作逻辑]\n");
                        break;
                    case 'B':
                        System.out.println("You selected Option B - [这里可以添加具体操作逻辑]\n");
                        break;
                    case 'C':
                        System.out.println("You selected Option C - [这里可以添加具体操作逻辑]\n");
                        break;
                    case 'D':
                        System.out.println("You selected Option D - [这里可以添加具体操作逻辑]\n");
                        break;
                    case 'X':
                        System.out.println("Exiting program... Goodbye!");
                        // 跳出循环,结束程序
                        return;
                    default:
                        System.out.println("Error: Please enter a valid character (A/B/C/D/X)!\n");
                }
            }
        }
    }

    // 主方法用于测试
    public static void main(String[] args) {
        new LoopTest().start();
    }
}

优化建议

  1. 封装操作逻辑:把每个选项对应的具体操作(比如Option A要执行的任务)封装成独立方法,比如handleOptionA(),这样switch分支会更简洁,代码可读性更强。
  2. 使用枚举类管理选项:如果后续选项可能扩展,建议用枚举类来定义所有菜单选项,比如:
enum MenuOption {
    A("Option #A"), B("Option #B"), C("Option #C"), D("Option #D"), EXIT("Exit");

    private final String description;

    MenuOption(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

这样可以统一管理菜单展示和选项判断,减少硬编码。
3. 输入验证增强:可以添加正则表达式判断输入是否为单个合法字符,避免用户输入多个字符的情况。
4. 代码规范:类名遵循大驼峰命名(原loopTest改为LoopTest),提升代码的规范性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:47:07