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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 04:36:03