Java中使用内置Stack API时的输入读取异常问题
为什么我的Java栈程序在粘贴多行输入时会等待额外输入?
这个问题的核心是**Scanner.nextInt()和nextLine()的交互逻辑**,以及粘贴输入时终端对换行符的处理方式导致的。咱们一步步拆解:
问题根源分析
先看你的代码里的关键部分:
int n = in.nextInt(); // 指令数量 in.nextLine(); // 消费nextInt()遗留的换行符
nextInt()的行为是:读取输入中的数字,但不会读取数字后面的换行符——它会把这个换行符留在输入流里。你调用in.nextLine()的本意是消费这个换行,但nextLine()的逻辑是读取从当前指针到下一个换行符之间的所有字符(包括空内容),然后丢弃换行符。
当你逐行输入时:
- 输入
6后按回车,nextInt()读取6,输入流里剩下\n in.nextLine()读取这个\n对应的空字符串,指针移到下一行开头- 之后你逐行输入6条指令,每次都按回车,循环的6次
nextLine()都能准确读取到每一条指令,所以程序正常运行。
但当你粘贴多行输入时,问题就来了:
假设你粘贴的内容是:
6 + 1 + 10 - + 2 + 1234 -
很多终端在粘贴时,最后一行的-后面不会自动添加换行符。这时候:
nextInt()读取6,输入流里剩下\n+ 1\n+ 10\n-\n+ 2\n+ 1234\n-in.nextLine()读取第一个\n对应的空字符串,指针移到+ 1的开头- 循环前5次
nextLine()分别读取到+ 1、+ 10、-(打印10)、+ 2、+ 1234 - 第6次循环调用
in.nextLine()时,输入流里只剩下-,且没有后续的换行符。nextLine()的逻辑是必须读取到换行符才会返回,所以程序会卡住等待你输入回车。 - 当你输入
test并回车后,nextLine()会把-test(-加上你输入的test)作为当前行的内容读取,此时str.charAt(0)还是-,所以执行stack.pop()打印1234,最后调试语句输出-test——这完全符合你描述的现象。
解决方法
解决这个问题的核心是避免nextInt()和nextLine()的混合使用,或者正确处理换行符:
方法1:统一用nextLine()读取所有输入
把读取指令数量的逻辑改成用nextLine(),再解析成整数:
String numLine = in.nextLine(); int n = Integer.parseInt(numLine.trim()); // 不需要额外消费换行符,直接进入循环 for(int i=0 ; i<n ; i++) { str = in.nextLine(); // 后续逻辑不变 }
这样不管是逐行输入还是粘贴多行,所有输入都会被按行正确读取,不会出现残留换行符的问题。
方法2:用skip()跳过换行符(如果坚持用nextInt())
如果你不想修改读取指令数量的方式,可以用skip()代替nextLine()来跳过nextInt()留下的换行符:
int n = in.nextInt(); // 跳过所有换行符(兼容Windows的\r\n和Linux的\n) in.skip(Pattern.compile("\\r?\\n"));
skip()只会跳过匹配的字符(这里是换行符),不会像nextLine()那样读取空内容,能更精准地处理输入流的指针位置。
内容的提问来源于stack exchange,提问作者jayanth
相关产品推荐
相关产品推荐

