Java如何用Scanner读取数字和句子 nextInt后nextLine为何失效
问题成因
Scanner类的nextInt()方法的设计逻辑是仅读取输入流中的整数内容,不会处理输入整数后按下回车产生的换行符\n,该换行符会残留在输入缓冲区中。而nextLine()方法的读取规则是从当前指针位置开始,直到遇到第一个换行符为止,返回两个位置之间的内容并跳过该换行符。因此调用完nextInt()后立即调用nextLine()时,方法会直接读取到残留的换行符,返回空字符串,看起来就像跳过了输入步骤。
可行解决方案
- 方案1:调用
nextInt()后主动调用一次nextLine()消费缓冲区残留的换行符
改动最小,适合输入逻辑固定的场景,修改后代码如下:
Scanner scanner = new Scanner(System.in); System.out.println("Enter a number: "); int x = scanner.nextInt(); scanner.nextLine(); // 新增行,用于吃掉残留的换行符 System.out.println("Enter a sentence"); System.out.println(x); String line = scanner.nextLine(); System.out.println(line);
- 方案2:所有输入统一使用
nextLine()读取,再手动转换为对应数据类型
从根本上避免了不同读取方法的缓冲区残留问题,稳定性更高,推荐使用,代码示例如下:
Scanner scanner = new Scanner(System.in); System.out.println("Enter a number: "); // 先读取整行内容,再手动转换为int类型 int x = Integer.parseInt(scanner.nextLine()); System.out.println("Enter a sentence"); System.out.println(x); String line = scanner.nextLine(); System.out.println(line);
- 方案3:如果需要读取的内容不包含空格,可以用
next()代替nextLine()next()方法会自动忽略开头的空白符,直到遇到下一个空白符停止读取,因此不会受到残留换行符的影响,但无法读取包含空格的完整句子,仅适合无空格内容的读取场景。
内容的提问来源于stack exchange,提问作者user15602150
相关产品推荐
相关产品推荐

