Java Scanner输入异常排查:SSS三角形程序输入阻塞问题
问题分析:Scanner无法接收角度单位输入的原因及解决办法
这是Java里Scanner输入处理的经典坑!我来给你拆解清楚:
问题根源:输入缓冲区的换行符残留
你之前用read.nextDouble()读取三边长度时,这个方法只会读取数字本身,不会处理你输入数字后按下的回车键(也就是换行符\n)。当你输入完最长边5并回车后,输入缓冲区里其实还剩一个\n没被处理。
而后续的read.nextLine()方法的逻辑是:读取从当前位置到下一个换行符之间的所有字符(包括空内容)。所以它直接把残留的\n之前的空字符串当成了用户输入,程序看起来“卡住无法输入”,其实已经完成了读取——只是读了个空字符串而已。
为什么之前的输入正常?
最开始的String response = read.nextLine();是程序启动后第一次读取输入,此时输入缓冲区是空的,nextLine()会一直等待用户输入内容并按下回车,所以能正常接收Y/N的输入。
解决办法(两种可选)
方案1:手动清除换行符
在读取完最后一个边长c之后,额外调用一次read.nextLine()来吃掉残留的换行符:
System.out.print("The length of the longest side: "); double c = read.nextDouble(); read.nextLine(); // 关键:清除输入5后的换行符
这样后续的String newResponse = read.nextLine();就会等待用户输入D/R了。
方案2:统一用nextLine()读取所有输入
把所有输入都用nextLine()读取,再转换成对应的数据类型,从根源上避免换行符残留问题:
System.out.print("The length of the smallest side: "); double a = Double.parseDouble(read.nextLine()); System.out.print("The length of the medium side: "); double b = Double.parseDouble(read.nextLine()); System.out.print("The length of the longest side: "); double c = Double.parseDouble(read.nextLine());
这种方法更统一,也不容易再踩类似的输入处理坑。
内容的提问来源于stack exchange,提问作者Kiernan Habershaw
相关产品推荐
相关产品推荐

