You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:10:00