Java代码运行时do-while循环前意外抛出NumberFormatException求助
错误原因
- 这是
java.util.Scanner的经典使用误区:你在读取骰子数量(对应控制台提示Enter the number of dice to draw (re-roll) - up to 3:的输入逻辑)时,使用了input.nextInt()方法读取整数。nextInt()只会读取输入的数字本身,不会消化你输入完成后按下的换行符,该换行符会残留在输入缓冲区中。 - 当do-while循环第一次执行调用
input.nextLine()时,会直接读取到缓冲区里残留的换行符,返回空字符串"",对空字符串做split(" ")后尝试转Integer就会抛出你遇到的NumberFormatException,因此看起来异常在循环逻辑执行前就触发了。 - 另外你当前的异常捕获列表没有包含
NumberFormatException,所以该异常没有被你自定义的catch逻辑处理,会直接打印默认异常信息到控制台。
修复方案
可选任意一种方案解决换行残留问题:
- 读完上一步的整数后,主动调用一次
nextLine()消化残留换行
在你获取骰子数量的代码后新增一行:
int drawNum = input.nextInt(); // 你原有读取骰子数量的代码 input.nextLine(); // 新增这行,吃掉输入缓冲区残留的换行符
- 统一所有输入都用
nextLine()读取,再自行转换为对应类型,避免不同输入方法混用的问题,比如读取骰子数量的逻辑改为:
String drawNumStr = input.nextLine(); int drawNum = Integer.parseInt(drawNumStr);
额外优化建议
补充NumberFormatException的捕获逻辑,避免后续用户输入非数字内容时直接抛出未处理异常:
catch (NumberFormatException nfe) { System.out.println(nfe); System.out.println("输入内容不是合法数字,请重试"); }
内容的提问来源于stack exchange,提问作者Chris A
相关产品推荐
相关产品推荐

