Java中Scanner.nextLine()传入值无法被数组比对函数识别
问题根因与修复方案
1. 字符串比对方式错误
- Java中
==运算符比对的是对象的内存地址,而非字符串的实际文本内容。 - 硬编码传入的相同字符串会被JVM放入字符串常量池复用,指向同一个内存地址,因此
==判断可以正常成立;Scanner动态读取的输入会生成全新的字符串对象,哪怕文本内容完全一致,内存地址也和数组中存储的常量字符串不同,因此永远无法通过==的匹配判断。 - 文本内容比对需替换为
equals方法,推荐写法示例:key[1][i].equals(door),这种写法可避免输入为null时触发空指针异常。
2. 遍历函数的逻辑缺陷
- 原代码的
return语句写在if-else分支外侧,不管第一次比对的结果是成功还是失败,都会直接跳出函数,完全不会遍历数组的剩余元素。 - 循环边界存在越界风险:原循环以
i <= arraylength为终止条件,且循环体内先执行i++再取值,最终i会取到等于数组长度的值,超出了数组从0开始的合法下标范围,会触发ArrayIndexOutOfBoundsException。正确的循环边界应为i < key[1].length。
3. Scanner输入的潜在干扰
- 代码中
scan.nextLine().toString()是冗余写法,nextLine()方法本身的返回值就是String类型。 - 如果代码中此前用过
nextInt()、nextDouble这类读取数值的方法,输入流中残留的换行符会被nextLine()直接读取为空字符串;此外用户输入时可能不小心在首尾多打空格,这两类不可见的空白字符都会导致文本匹配失败。可以在传入函数前对输入执行trim()方法,去除首尾的所有空白字符。
修正后的参考实现
public static void use(String door, String[][] key){ String[] validDoorList = key[1]; // 预处理输入,去除首尾空白 String processedInput = door == null ? "" : door.trim(); canOpen = false; for (int i = 0; i < validDoorList.length; i++){ // 修正为字符串内容比对 if (validDoorList[i] != null && validDoorList[i].equals(processedInput)) { canOpen = true; System.out.println(canOpen); // 匹配成功立刻退出循环,不需要继续遍历 return; } } // 全量遍历完成无匹配再输出失败结果 System.out.println(canOpen + " " + door + " " + Arrays.toString(validDoorList)); }
内容的提问来源于stack exchange,提问作者Gabriella Green
相关产品推荐
相关产品推荐

