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
相关产品推荐
相关产品推荐

