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
相关产品推荐
相关产品推荐

