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

字符串重复字符检测代码触发StringIndexOutOfBoundsException运行时错误求助

排查StringIndexOutOfBoundsException错误并修复重复字符检测代码

咱们先直接说触发StringIndexOutOfBoundsException的核心原因:Java里字符串的索引是从0开始计数的,最大的有效索引是字符串长度-1,你的代码里循环的索引范围完全踩了这个坑:

错误点拆解

  • 外层循环for(int count=1; count<=name.length(); count++):当count等于name.length()时,name.charAt(count)访问的是字符串不存在的位置(比如长度为5的字符串,最大索引是4),直接触发越界。
  • 内层循环for(int down = name.length(); down>0; down--):同样,初始值down = name.length()本身就是无效索引;而且结束条件down>0会漏掉索引为0的字符,导致检测不完整。

另外你的代码还有逻辑问题:每次比较两个字符就立刻输出结果,这会导致控制台反复打印重复/不重复的信息,完全不符合“检测是否存在重复字符”的需求——咱们应该是遍历完所有可能的字符对,确定是否存在重复后,只输出一次结果。

解决方案

方案1:修正索引+优化双重循环逻辑

调整循环的索引范围,同时用一个标记变量记录是否找到重复:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String name = sc.next().trim();
        boolean hasDuplicate = false;
        
        // 外层循环从第一个字符(索引0)到倒数第二个字符
        for(int count = 0; count < name.length() - 1; count++) {
            char ch = name.charAt(count);
            // 内层循环从外层字符的下一个位置开始,避免重复比较
            for(int down = count + 1; down < name.length(); down++) {
                char sh = name.charAt(down);
                if(ch == sh) {
                    hasDuplicate = true;
                    // 找到重复后直接跳出所有循环,提升效率
                    break;
                }
            }
            if(hasDuplicate) {
                break;
            }
        }
        
        // 遍历结束后统一输出结果
        if(hasDuplicate) {
            System.out.println("There is a repeated character");
        } else {
            System.out.println("There is no repeated character");
        }
        sc.close();
    }
}

方案2:用Set集合简化检测(更高效简洁)

利用Set集合不允许重复元素的特性,遍历字符串时尝试添加字符,如果添加失败说明存在重复:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String name = sc.next().trim();
        Set<Character> charSet = new HashSet<>();
        boolean hasDuplicate = false;
        
        for(char c : name.toCharArray()) {
            if(!charSet.add(c)) {
                hasDuplicate = true;
                break;
            }
        }
        
        if(hasDuplicate) {
            System.out.println("There is a repeated character");
        } else {
            System.out.println("There is no repeated character");
        }
        sc.close();
    }
}

补充说明

  • 我把原代码里的"repeated word"改成了"repeated character",因为你的代码是检测字符重复,不是单词重复,表述更准确。
  • 记得用完Scanner后调用sc.close()释放资源,养成良好的编码习惯。

内容的提问来源于stack exchange,提问作者Shrey Joshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:30:37