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

Java中ASCII字符计数程序遇ArrayOutOfBoundsException问题求助

问题分析与解决

嘿,这个数组越界问题的根源很明确——你预设了所有字符都是ASCII码(0-255),但实际文件里出现了超出这个范围的Unicode字符!

错误里的8217是右单引号(’)的Unicode编码,它属于扩展字符,远大于255。你定义的count数组长度只有256,当代码尝试访问count[8217]时,自然就触发了数组越界异常。

代码里的两个核心问题

  • 字符范围假设错误:你创建了长度为256的count数组,只覆盖了ASCII字符,但实际文本可能包含各种Unicode字符(比如中文、特殊标点、emoji等)
  • 大文本处理效率低:用removeSpace+=strLine拼接整个文件内容的方式,在处理大文本时会占用大量内存,甚至可能引发内存溢出

解决方案

如果你的需求是统计所有字符(包括非ASCII),推荐用HashMap<Character, Integer>来替代固定长度的数组,这样不管字符编码是多少,都不会出现越界问题,同时还能优化读取逻辑,不用把整个文件加载到内存:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

class CharacterCounter {
    public static void main(String[] args) {
        try {
            countCharacters();
        } catch (IOException e) {
            System.out.println(e.getClass().getSimpleName() + "-" + e.getMessage());
        }
    }

    private static void countCharacters() throws IOException {
        // 优化读取逻辑,边读边处理,不加载整个文件
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(new FileInputStream("/Users/Devonte1/Desktop/Javatest.txt")))) {
            
            Map<Character, Integer> charCountMap = new HashMap<>();
            String strLine;
            
            while ((strLine = br.readLine()) != null) {
                // 去掉空格(如果需要)
                String lineWithoutSpace = strLine.replaceAll(" ", "");
                for (char ch : lineWithoutSpace.toCharArray()) {
                    // 更新字符计数:存在则+1,不存在则初始化为1
                    charCountMap.put(ch, charCountMap.getOrDefault(ch, 0) + 1);
                }
            }

            // 输出统计结果
            System.out.println("Character Total");
            for (Map.Entry<Character, Integer> entry : charCountMap.entrySet()) {
                char ch = entry.getKey();
                int count = entry.getValue();
                System.out.printf("Character '%c' used %d times (char code: %d)%n", 
                        ch, count, (int) ch);
            }

            // 如果需要单独输出未使用的ASCII字符,可以单独遍历0-255
            System.out.println("\nUnused ASCII Characters:");
            for (int i = 0; i < 256; i++) {
                char ch = (char) i;
                if (!charCountMap.containsKey(ch)) {
                    System.out.printf("Character '%c' (char code: %d) not used%n", ch, i);
                }
            }
        }
    }
}

如果你的需求只统计ASCII字符,可以在遍历字符时加个判断,跳过非ASCII的字符:

for (char ch : lineWithoutSpace.toCharArray()) {
    if ((int) ch < 256) { // 只处理ASCII字符
        charCountMap.put(ch, charCountMap.getOrDefault(ch, 0) + 1);
    }
}

这样修改后,不管是大文本还是包含特殊字符的文本,都不会再出现数组越界的问题,同时内存占用也会低很多~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:28:35