Java数组输入异常:为何需输入6次而非预期的2次?
问题分析与修复方案
让我帮你拆解下代码里的问题,以及怎么解决输入次数过多、结果显示异常的问题:
核心问题点
- 重复创建Scanner完全没必要:你每次循环都新建
Scanner s1和Scanner s2,这会导致输入流的管理混乱,而且完全是冗余操作——只用一个Scanner就能处理所有输入。 - 多次调用
nextLine()导致输入被“浪费”:
比如你先调用s1.nextLine()判断是否是"END",这已经读取了一行输入,但没保存;接着又调用s1.nextLine()给str1[count]赋值,这时候读的是下一行输入,等于你第一次输入的内容直接被丢弃了。
最后打印时又调用s1.nextLine()和s2.nextLine(),这又会强制你再输入两行,所以你看到的打印结果其实是这两次新输入的内容,和你存在数组里的内容完全无关。 - 字符串比较用错了方法:Java里
==是比较对象引用,不是字符串内容,判断字符串相等应该用equals()方法,否则永远无法正确识别"END"结束符。
修正后的代码
import java.util.Scanner; public class DependencyInput { public static void main(String[] args) { String str1[] = new String[100]; String str2[] = new String[100]; int count = 0; // 只初始化一次Scanner,复用它处理所有输入 Scanner scanner = new Scanner(System.in); while (true) { // 先读取左项输入,保存到变量后再判断是否结束 System.out.print("请输入第" + (count + 1) + "个依赖的左项(输入END结束):"); String left = scanner.nextLine(); if ("END".equals(left)) { break; } str1[count] = left; // 读取右项输入,同样先保存再判断 System.out.print("请输入第" + (count + 1) + "个依赖的右项(输入END结束):"); String right = scanner.nextLine(); if ("END".equals(right)) { break; } str2[count] = right; count++; // 直接用数组里已保存的内容打印,不再额外读取输入 System.out.println("完成第" + count + "个依赖: " + str1[count - 1] + "->" + str2[count - 1]); } scanner.close(); // 用完关闭Scanner,释放资源 } }
改进说明
- 单Scanner实例:避免输入流混乱,简化代码逻辑;
- 先存后判:把每次输入先保存到变量,再判断是否为结束符,不会浪费输入内容;
- 正确的字符串比较:用
"END".equals(input)的方式,既保证内容比较,还能避免空指针风险; - 打印复用已存内容:直接使用数组里的左项和右项,不再强制额外输入,解决了结果显示异常的问题;
- 增加提示语:让用户清楚知道当前该输入什么,提升交互体验。
内容的提问来源于stack exchange,提问作者蔡王辉
相关产品推荐
相关产品推荐

