Java餐厅JDBC项目使用Scanner的hasNext方法出现无限循环如何解决
问题根因
你的代码进入死循环的核心原因是无效输入未被消费:
- 当用户输入非整数内容(比如字母、特殊符号)时,
scanner.hasNextInt()会返回false,此时你没有做任何处理清空Scanner缓冲区的无效数据,这部分内容会一直残留在缓冲区中 - 下一轮循环再次判断
scanner.hasNextInt()时,仍然会读取到同一批无效内容,持续返回false,布尔变量c永远不会被修改为false,程序就会一直循环打印菜单 - 另外补充一个隐藏隐患:
scanner.nextInt()只会读取整数本身,不会吃掉输入末尾的换行符,后续如果添加读取字符串的逻辑会直接读到空值,建议同步处理
修复方案
你只需要在scanner.hasNextInt()返回false的分支里,添加无效内容消费逻辑即可,同时可以补充非法输入的提示,优化用户体验:
package com.restaurant.orders; import java.util.Scanner; public class Main { public static void main(String[] args) { System.out.println("WELCOME TO UR RESTAURANT"); System.out.println("PLEASE, PLACE UR ORDER: "); ManageOrders.PlaceOrder(); System.out.println("ANYTHING ELSE???"); Scanner scanner=new Scanner(System.in); boolean c=true; while(true) { System.out.println("1. CancleOrder"); System.out.println("2. CancleDish"); System.out.println("3. ReplaceDish"); System.out.println("4. DisplayOrderDetails"); System.out.println("5. Nothing, Thank you!!"); if(scanner.hasNextInt()) { int ch=scanner.nextInt(); // 消费nextInt()残留的换行符 scanner.nextLine(); switch(ch) { case 1:ManageOrders.CancleOrder();break; case 2:ManageOrders.CancleDish();break; case 3:ManageOrders.ReplaceDish();break; case 4:ManageOrders.DisplayorderDetails();break; case 5:c=false;break; // 补充非法数字输入提示 default:System.out.println("请输入1-5之间的有效数字"); } } else { // 消费无效输入 System.out.println("输入格式错误,请输入数字"); scanner.nextLine(); } if(!c) { break; } } scanner.close(); } }
内容的提问来源于stack exchange,提问作者APOORVA SIRIGIRI
相关产品推荐
相关产品推荐

