实习项目中Scanner为quantity赋值时程序执行停滞无报错求助
解决Scanner赋值时线程停滞的问题
嘿,我来帮你排查这个Scanner卡住的问题~结合你说的实习项目场景(费用类别选择、金额存ArrayList、打印总费用),我梳理了几个常见的原因和对应的解决方案:
常见原因分析
输入类型不匹配导致无限等待
如果你的quantity定义为int类型,但用户输入了小数、字母或者其他非数字内容,Scanner会一直卡在那里等待有效的整数输入,而且不会抛出错误,看起来就像线程停滞了。Scanner缓冲区残留的空白字符干扰
要是你在读取quantity之前用了nextLine()读取费用类别,有时候缓冲区里残留的换行符会让后续的输入方法出现异常行为(不过nextInt()/nextDouble()会自动跳过空白,这个情况概率稍低,但如果是用next()读类别再用nextLine()读金额,就很容易踩坑)。Scanner初始化错误
确保你是用System.in作为输入源初始化的Scanner,比如new Scanner(System.in),如果用了其他输入流,也可能导致无法读取控制台输入。
修复后的代码示例
我结合你的需求写了一段完整的可运行代码,解决了Scanner停滞的问题,还优化了金额的类型(用double更贴合实际费用场景):
package gestioneconomica; import java.util.ArrayList; import java.util.Scanner; public class ExpenseTracker { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); ArrayList<Double> categoryExpenses = new ArrayList<>(); String selectedCategory; double expenseAmount; // 引导用户选择费用类别 System.out.println("请选择费用类别(例如:餐饮、交通、购物):"); selectedCategory = scanner.nextLine(); // 安全读取费用金额,避免输入无效内容导致停滞 System.out.println("请输入该类别的费用金额:"); while (!scanner.hasNextDouble()) { System.out.println("输入无效,请输入数字格式的金额(支持小数):"); scanner.next(); // 丢弃无效的输入内容,避免死循环 } expenseAmount = scanner.nextDouble(); categoryExpenses.add(expenseAmount); // 计算并打印该类别的总费用 double totalExpense = 0; for (double expense : categoryExpenses) { totalExpense += expense; } System.out.printf("类别【%s】的总费用为:%.2f\n", selectedCategory, totalExpense); scanner.close(); // 使用完毕后关闭Scanner } }
关键优化点
- 用
hasNextDouble()提前校验输入是否有效,避免Scanner无限等待 - 金额用
double类型,支持小数金额的输入 - 加入了无效输入的提示逻辑,提升用户体验
- 最后关闭Scanner,释放资源
内容的提问来源于stack exchange,提问作者user9146924
相关产品推荐
相关产品推荐

