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

Java带do-while的Switch菜单出现NoSuchElementException异常求助

问题原因

你遇到的NoSuchElementException是因为每次调用menu()方法时都创建新的Scanner并关闭它——关闭Scanner会同时关闭关联的System.in输入流。当do-while循环第二次执行ch = menu()时,新的Scanner尝试从已经关闭的System.in读取输入,自然会抛出异常。

修复方案

核心思路是:只创建一个Scanner实例,在整个程序运行期间复用,避免重复关闭System.in。

方案1:将Scanner定义为类的静态成员

修改代码如下:

import java.util.Scanner;

public class teste{
    // 定义静态Scanner,全局复用
    private static Scanner input = new Scanner(System.in);

    public static void main(String[] args){
        char ch;
        do {
            ch = menu();
            switch (ch){
                case 'a':
                    //String name ="resultado.csv";
                    //ReadFile(name);
                    break;
                case 'b':
                    //WriteFile();
                    break;
                case 'c':
                    System.out.println("nome");
                    break;
                case 'd':
                    System.out.println("nome");
                    break;
                case 'e':
                    System.out.println("nome");
                    break;
                case 'f':
                    System.out.println("nome");
                    break;
                case 'g':
                    System.out.println("nome");
                    break;
                case 'h':
                    System.out.println("nome");
                    break;
                case 'k':
                    System.out.println("退出程序");
                    // 程序结束前关闭Scanner
                    input.close();
                    break;
                default:
                    System.out.println("请输入a-k之间的选项!");
                    break;
            }
        }while (ch != 'k');
        System.exit(0);
    }

    public static char menu(){
        System.out.println("请选择操作: ");
        System.out.println("a: 显示");
        System.out.println("b: 写入");
        System.out.println("c: 检查所有数字是否相同");
        System.out.println("d: 计算两个整数的和");
        System.out.println("e: 重复字符串");
        System.out.println("f: 判断是否为回文");
        System.out.println("g: 展示内容");
        System.out.println("h: 展示内容");
        System.out.println("k: 退出");
        System.out.println("请输入选项: ");
        // 直接使用全局的Scanner
        char ch = input.next().charAt(0);
        return ch;
    }
}

方案2:将Scanner作为参数传入menu()方法

这种方式更符合单一职责原则,避免静态成员:

import java.util.Scanner;

public class teste{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        char ch;
        do {
            ch = menu(input);
            switch (ch){
                case 'a':
                    //String name ="resultado.csv";
                    //ReadFile(name);
                    break;
                case 'b':
                    //WriteFile();
                    break;
                case 'c':
                    System.out.println("nome");
                    break;
                case 'd':
                    System.out.println("nome");
                    break;
                case 'e':
                    System.out.println("nome");
                    break;
                case 'f':
                    System.out.println("nome");
                    break;
                case 'g':
                    System.out.println("nome");
                    break;
                case 'h':
                    System.out.println("nome");
                    break;
                case 'k':
                    System.out.println("退出程序");
                    input.close();
                    break;
                default:
                    System.out.println("请输入a-k之间的选项!");
                    break;
            }
        }while (ch != 'k');
        System.exit(0);
    }

    public static char menu(Scanner input){
        System.out.println("请选择操作: ");
        System.out.println("a: 显示");
        System.out.println("b: 写入");
        System.out.println("c: 检查所有数字是否相同");
        System.out.println("d: 计算两个整数的和");
        System.out.println("e: 重复字符串");
        System.out.println("f: 判断是否为回文");
        System.out.println("g: 展示内容");
        System.out.println("h: 展示内容");
        System.out.println("k: 退出");
        System.out.println("请输入选项: ");
        char ch = input.next().charAt(0);
        return ch;
    }
}
额外建议
  • 可以在读取输入时增加判断,避免用户直接回车导致的异常:
    while (!input.hasNext()) {
        System.out.println("请输入有效选项!");
        input.next(); // 清空无效输入
    }
    char ch = input.next().charAt(0);
    
  • 注意输入的大小写,比如用户输入大写A时会走到default分支,可以统一转成小写:input.next().toLowerCase().charAt(0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:35:19